方法语法
本主题描述如何使用 methods...end
块在 MATLAB® 中定义类方法,并介绍方法参量验证。本主题重点介绍非静态的具体方法,也称为普通方法。对于其他类型的方法,请参阅:
方法定义块
methods
和 end
关键字定义一个或多个具有相同特性设置的类方法。方法本身是使用 MATLAB 函数模块定义的。定义普通方法块的语法是:
methods (attributes) function method1(obj,arg1,...) ... end function method2(obj,arg1,...) ... end ... end
除了静态方法之外,必须将类的对象显式传递给 MATLAB 方法。
例如,此类定义一个公共属性和两个公共方法。每个方法都接受两个输入参量:对象本身和用户提供的参量 inputArg
。这些方法计算类属性 Property1
的值和输入参量的乘积与商。
classdef methodDemo properties Property1 end methods function prod = propMultiply(obj,inputArg) prod = obj.Property1*inputArg; end function quotient = propDivide(obj,inputArg) quotient = obj.Property1/inputArg; end end end
您还可以定义多个具有不同特性的方法块。在此示例中,第一个方法是受保护方法,第二个方法是私有方法。有关详细信息,请参阅方法特性。
classdef attributeDemo methods (Access = protected) function out = method1(obj,inputArg) ... end end methods (Access = private) function out = method2(obj,inputArg) ... end end end
方法参量验证
您可以为方法输入和输出参量定义限制。要验证方法参量,请像对待函数一样,将 arguments
块添加到方法。有关详细信息,请参阅 arguments
。
输入参量验证
输入参量验证使您能够限制方法输入参量的大小、类和其他特征。输入参量验证的语法是:
arguments argName1 (dimensions) class {validators} = defaultValue ... end
- 输入大小,指定为包含两个或多个数值的以逗号分隔的列表,如(dimensions)
(1,2)
。
- 类,指定为类名称,如class
double
或用户定义的类的名称。
- 以逗号分隔的验证函数(如{validators}
mustBeNumeric
和mustBeScalarOrEmpty
)列表,用花括号括起来。有关验证函数的列表,请参阅 参量验证函数。
- 默认值必须符合指定的大小、类型和验证规则。defaultValue
有关输入参量验证语法中元素的完整描述,请参阅 arguments
。
输入参量验证对于具有公共访问权限的方法非常有用。对方法的调用方所允许的参量值类型进行限制可以保证在执行方法体时不出错。例如,Rectangle
类表示坐标平面中的一个矩形,属性指定其位置(X
和 Y
)及其宽度和高度。
classdef Rectangle properties X (1,1) double {mustBeReal} = 0 Y (1,1) double {mustBeReal} = 0 Width (1,1) double {mustBeReal} = 0 Height (1,1) double {mustBeReal} = 0 end methods function R = enlarge(R,x,y) arguments (Input) R (1,1) Rectangle x (1,1) {mustBeNonnegative} y (1,1) {mustBeNonnegative} end arguments (Output) R (1,1) Rectangle end R.Width = R.Width + x; R.Height = R.Height + y; end end end
enlarge
方法通过将用户输入 x
和 y
分别加到 Width
和 Height
中来增加矩形的高度和宽度。由于该方法旨在放大一个矩形,因此验证将输入参量限制为标量值,大小限制为 (1,1)
,非负数值限制为 mustBeNonnegative
。
实例化该类,调用 enlarge
,将 5
和 -1
作为 enlarge
的输入。参量验证返回错误。
rect1 = Rectangle; rect1.enlarge(5,-1))
Error using Rectangle/enlarge rect1.enlarge(5,-1) ↑ Invalid argument at position 2. Value must be nonnegative.
提示
输入参量块的 (Input)
特性是可选的,但当在一个方法中同时定义输入和输出参量块时,推荐使用特性以提高可读性。MATLAB 将没有任何特性的参量块解释为输入参量块。
输出参量验证
输出参量验证的语法与输入验证的语法相同,不同之处在于必须指定 (Output)
作为参量块的特性,并且无法设置默认值。
arguments (Output) argName1 (dimensions) class {validators} ... end
有关输出参量验证语法的完整描述,请参阅 arguments
。
输出参量验证使类编写者能够记录方法返回什么类型的输出,并作为保障措施来防止将来对可能更改输出类型的代码进行更改。例如,Rectangle
的 enlarge
方法使用输出参量验证来确保对象方法返回 Rectangle
的标量实例。
arguments (Output) R (1,1) Rectangle end
例如,如果 enlarge
后来修改为仅返回 Rectangle
的维度,而不是对象本身,则输出验证有助于捕获此潜在错误。
方法验证的特殊考虑事项
类方法的参量验证工作方式很像函数,但参量验证的某些方面是方法所独有的。
如果
classdef
文件包含在单独文件中定义的方法的方法原型,则您要为这些方法定义的任何arguments
块都必须在单独文件中定义。有关在单独的文件中定义方法的详细信息,请参阅在单独文件中定义方法。子类方法不继承参量验证。要在覆盖超类方法的子类方法中保留参量验证,请在子类方法中重复超类方法中的参量验证。
抽象方法不支持参量验证,因为它们无法定义
arguments
块。有关详细信息,请参阅抽象类和类成员。句柄类析构函数方法无法使用参量验证。在句柄类中,当句柄对象变得不可达或通过调用
delete
被显式删除时,由 MATLAB 会调用名为delete
的析构函数方法。一个析构函数只能有一个输入,没有输出,也没有参量验证。MATLAB 将以任何其他方式定义的方法视为普通方法,不会将其用作析构函数。有关详细信息,请参阅句柄类析构函数。