方法调用
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。