方法调用
MATLAB® 类支持圆点语法和函数语法来调用方法。本主题演示这两种语法,并描述 MATLAB 如何确定要调用的方法。
圆点语法和函数语法
要使用一个参量 arg 调用非静态方法,其中 obj 是定义该方法的类的对象,请使用圆点语法或函数语法。
obj.methodName(arg) methodName(obj,arg)
例如,dataSetSummary 存储一组数值数据以及该数据的均值、中位数和范围。该类定义两个方法:showDataSet 显示存储在 data 属性中的当前数据,而 newDataSet 替换 data 的当前值并计算该数据的均值、中位数和范围。
classdef dataSetSummary properties (SetAccess=private) data {mustBeNumeric} dataMean dataMedian dataRange end methods function showDataSet(obj) disp(obj.data) end function obj = newDataSet(obj,inputData) obj.data = inputData; obj.dataMean = mean(inputData); obj.dataMedian = median(inputData); obj.dataRange = range(inputData); end end end
创建 dataSetSummary 的一个实例,并调用 newDataSet 来向对象添加数据。使用圆点语法调用 newDataSet。由于 dataSetSummary 是值类,请将结果赋回原始变量以保留更改。
a = dataSetSummary; a = a.newDataSet([1 2 3 4])
a =
dataSetSummary with properties:
data: [1 2 3 4]
dataMean: 2.5000
dataMedian: 2.5000
dataRange: 3
调用 showDataSet 方法,但对此调用使用函数语法。
showDataSet(a)
1 2 3 4
使用表达式引用方法名称
通过将表达式括在括号中,您可以动态调用类方法。
obj.(expression)
表达式的计算结果必须为作为方法名称的字符向量或字符串。例如,对于属于类 dataSetSummary 的对象 a,以下两条语句是等效的。
a.showDataSet
a.("showDataSet")当与函数语法结合使用时,这种方法不起作用。
对方法调用的结果进行索引
对于任何方法,如果针对其返回值定义了点索引方法,例如对象属性或结构体字段名称,那么就可对该方法的结果进行点索引。例如,向 dataSetSummary 类添加新方法 returnSummary,该方法返回结构体中的所有存储数据。
function outStruct = returnSummary(obj) outStruct = struct("Data",obj.data,... "Mean",obj.dataMean,... "Median",obj.dataMedian,... "Range",obj.dataRange); end
调用 returnSummary 并使用点索引来返回数据集的中位数。
a.returnSummary.Median
ans =
2.5000有关对函数调用结果进行索引的详细信息,请参阅对函数调用结果进行索引。
确定调用哪个方法
当使用圆点语法调用方法时,MATLAB 调用由圆点左侧的对象的类定义的方法。例如,如果 classA 和 classB 都定义了名为 plus 的方法,则以下代码始终调用由 classA 定义的 plus 方法。
A = classA; B = classB; A.plus(B)
不考虑其他参量。从不调用其他参量的方法,也不调用函数。
在其他语法中,MATLAB 必须确定在给定情况下调用运算符或函数的多个版本中的哪个版本。默认行为是调用与最左侧的参量相关联的方法。在以下两个语句中,都调用由 classA 定义的 plus 方法。
objA + objB plus(objA,objB)
不过,当一个对象优先于另一个对象时,此默认行为可以更改。
对象优先级
根据类的定义方式,在方法调度时,这些类的对象可以优先于其他对象:
用
classdef语法定义的类优先于以下 MATLAB 类:double、single、int64、uint64、int32、uint32、int16、uint16、int8、uint8、char、string、logical、cell、struct和function_handle。用
classdef语法定义的类可以使用InferiorClasses属性指定它们相对于其他类的优先级。
在Representing Polynomials with Classes中,DocPolynom 类定义 plus 方法,该方法对 DocPolynom 对象执行加法运算。构造一个 DocPolynom 实例。
p = DocPolynom([1 0 -2 -5])
p =
x^3 - 2*x - 5
下面的语句向 DocPolynom 实例加上一个双精度值。尽管 double 是 1 + p 中最左侧的参量,但 DocPolynom 类优先于内置的 double 类。以下代码调用 DocPolynom plus 方法来加上多项式。
1 + p
ans =
x^3 - 2*x - 4
您还可以通过在类属性中列出次优先级的类来指定用 classdef 语法定义的类的相对优先级。InferiorClasses 属性赋予所定义的类比作为该属性的参量列出的类更高的优先级。在 classdef 语句中定义 InferiorClasses 属性:
classdef (InferiorClasses = {?class1,?class2}) myClass
此属性建立所定义的类的相对优先级,并按照列出的类的顺序排列。有关详细信息,请参阅Class Precedence。