Main Content

方法调用

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 调用由圆点左侧的对象的类定义的方法。例如,如果 classAclassB 都定义了名为 plus 的方法,则以下代码始终调用由 classA 定义的 plus 方法。

A = classA;
B = classB;
A.plus(B)

不考虑其他参量。从不调用其他参量的方法,也不调用函数。

在其他语法中,MATLAB 必须确定在给定情况下调用运算符或函数的多个版本中的哪个版本。默认行为是调用与最左侧的参量相关联的方法。在以下两个语句中,都调用由 classA 定义的 plus 方法。

objA + objB
plus(objA,objB)

不过,当一个对象优先于另一个对象时,此默认行为可以更改。

对象优先级

根据类的定义方式,在方法调度时,这些类的对象可以优先于其他对象:

  • classdef 语法定义的类优先于以下 MATLAB 类:

    doublesingleint64uint64int32uint32int16uint16int8uint8charstringlogicalcellstructfunction_handle

  • classdef 语法定义的类可以使用 InferiorClasses 属性指定它们相对于其他类的优先级。

Representing Polynomials with Classes中,DocPolynom 类定义 plus 方法,该方法对 DocPolynom 对象执行加法运算。构造一个 DocPolynom 实例。

p = DocPolynom([1 0 -2 -5])
p =
    x^3 - 2*x - 5

下面的语句向 DocPolynom 实例加上一个双精度值。尽管 double1 + p 中最左侧的参量,但 DocPolynom 类优先于内置的 double 类。以下代码调用 DocPolynom plus 方法来加上多项式。

1 + p
ans =
    x^3 - 2*x - 4

您还可以通过在类属性中列出次优先级的类来指定用 classdef 语法定义的类的相对优先级。InferiorClasses 属性赋予所定义的类比作为该属性的参量列出的类更高的优先级。在 classdef 语句中定义 InferiorClasses 属性:

classdef (InferiorClasses = {?class1,?class2}) myClass

此属性建立所定义的类的相对优先级,并按照列出的类的顺序排列。有关详细信息,请参阅Class Precedence

相关主题