主要内容

方法调用

确定调用哪个方法

当MATLAB®调用具有参数列表的普通方法,它使用以下条件来确定要调用的方法

  • 如果最左边的参数的类没有指定为低于任何其他参数的类,那么它的类将被选择为主导类,并调用它的方法。

  • 如果这个类没有定义被调用的方法,那么就会调用MATLAB路径上的同名函数。

  • 如果不存在这样的函数,MATLAB将发出一个错误,表明主导类没有定义命名方法。

主导论点

MATLAB使用主导参数调度来确定调用哪个版本的方法。在方法调度期间,MATLAB从调用中的参数中确定主导类。一般来说,所有MATLAB类使用classdef对于方法调度而言,语法具有同样的优先级。

类使用classdef语法优先于这些MATLAB类:

int64uint64int32uint32int16uint16int8uint8字符字符串逻辑细胞结构体,function_handle

通常,当参数列表中包含两个或多个对象时,将调用为最左边对象的类定义的方法。然而,用户定义的类可以指定特定类的相对优势。信息,请参阅类优先

例如,假设classA定义了classB并假设两个类都定义了一个被调用的方法结合

调用带有对象的方法classBclassA

结合(B)

实际上调用结合的方法classA因为一个是主要论点。

点符号和函数符号

MATLAB类支持函数和点符号金宝app语法来调用方法。例如,如果改变颜色是对象类的方法吗X,然后调用改变颜色函数表示法为:

X=设置颜色(X,“红色”);

使用点表示法的等效方法调用为:

X = X.setColor (“红色”

然而,在某些情况下,点符号的结果可能与MATLAB调度的工作方式不同:

  • 如果有超载subsref,每当使用点表示法时都会调用它。也就是说,首先测试语句,看看它是否被下标赋值。

  • 如果没有超载subsref,然后改变颜色一定是一种方法吗X.普通函数或类构造函数永远不会使用这种表示法调用。

  • 只有参数X(在点的左边)用于调度。没有其他论点,即使占主导地位,被考虑。因此点表示法只能调用的方法X;其他参数的方法永远不会被调用。

结果不同的情况。下面是一个点和函数表示法可以给出不同结果的例子。假设你有以下类:

  • classA定义一个名为methodA这需要一个对象classB这是它的论点之一

  • classB定义了classA像差classB

classdef(class = {?classA})…结束

methodA方法使用两个输入参数定义,其中一个参数是classB

classdefclassA方法函数methodA (obj obj_classB),…结束结束

classB没有定义与methodA.因此,下面的语法导致MATLAB在路径中搜索与methodA因为第二个参数是主导类的对象。如果路径上存在具有该名称的函数,则MATLAB将尝试调用该函数而不是方法classA并且很可能返回语法错误。

obj = classA(…);methodA (obj obj_classB),

点符号在其行为上更为严格。例如,这个调用methodA

obj = classA(…);obj.methodA (obj_classB)

只能打电话methodA属于obj

使用表达式引用名称动态引用

你可以使用圆括号语法中的表达式引用对象的属性或方法:

obj。(表达式

表达式的值必须为字符向量,它是属性或方法的名称。例如,以下语句是等价的:

obj。Property1 obj。(“Property1”)

在这种情况下,obj定义属性的类的对象是否被调用Property1.因此,你可以通过一个字符变量在括号中引用属性:

propName='Property1';对象(名称)

你可以调用一个方法并使用另一组括号将输入参数传递给该方法:

obj。(表达式) (__arg1,最长,…)

使用这种表示法,您可以以创建对的字段的动态引用的相同方式创建对属性和方法的动态引用结构体

例如,假设一个对象有对应于一周中每一天的方法。这些方法的名称与星期相同(周一周二,等等)。此外,这些方法如下所示:字符向量输入参数,当月的当前日期(日期)。现在假设您编写了一个函数,希望在其中为当天调用正确的方法。

使用创建的表达式日期datestr功能:

obj。(datestr(日期,“dddd”)) (datestr(日期,“弟弟”))

表达式datestr(日期、“dddd”)返回当前日期为字符向量。例如:

datestr(日期,“dddd”ans =星期二

表达式日期str(日期,'dd')将当前日期作为字符向量。例如:

datestr(日期,“弟弟”) ans = 11

因此,使用圆括号的表达式(在周二的11th)相当于:

obj。周二(“11”

索引到方法调用的结果

您可以对方法调用的结果使用点索引来获取值。例如,此类定义属性和构造函数方法。构造函数在使用输入参数计算表达式后设置属性值。

classdef波利瓦尔性质结果结束方法函数obj = polyEval (x)如果输入参数个数obj。结果= 2*x.^3 + 7*x.^2 + 2*x + 7;结束结束结束结束

您可以在调用构造函数方法的结果中建立索引,以访问属性的值。例如,这个调用polyEval ()返回分配给属性的值。的实例波利瓦尔类是作为临时变量创建的,不会保存在工作区中。

.Result polyEval (-3.5)
ans = 0

在这个例子中,表达式,.Result polyEval (-3.5)代表了价值0(价值-3.5是多项式的根)。您可以将该表达式的计算结果赋值给一个变量,或在其他表达式中使用它。

您可以对返回定义了点索引的结果的任何方法的结果进行点索引,例如可以使用属性或字段名索引的对象或结构。即使没有参数,也必须在所有索引表达式中包含括号。例如,索引到调用的结果polyEval ()构造函数中没有输入,请使用此表达式。

polyEval()。结果

有关对函数调用结果进行索引的更多信息,请参见索引到函数调用结果

控制方法的访问

可能存在这样的情况:您希望在类中创建用于内部计算的方法,但不希望将这些方法作为类的公共接口的一部分发布。在这些情况下,您可以使用访问属性将访问设置为下列选项之一:

  • 平民的-任何有权访问该类对象的代码都可以访问该方法(默认值)。

  • 私人-限制方法对定义类的访问,不包括子类。子类不继承私有方法。

  • 受保护的-限制方法对定义类和派生自定义类的子类的访问。子类继承这个方法。

  • 访问列表——限制方法对访问列表中的类的访问。有关更多信息,请参见类成员的访问

方法文件中的局部函数和嵌套函数具有与方法相同的访问权限。类定义文件中的局部函数对同一文件中定义的类具有私有访问权限。

在子类方法中调用超类方法

子类可以重写超类中定义的方法的实现。如果子类方法需要执行额外的代码而不是完全替换超类方法。MATLAB类可以使用一种特殊的语法从子类实现中调用同名方法的超类方法。

在子类中调用超类方法的语法使用@符号:

MethodName超类名

例如,下面disp方法定义股票类派生的资产类。方法首先调用资产disp方法,通过股票对象,以便资产组成部分股票对象可以显示。后资产disp方法返回股票disp方法显示两个股票属性:

classdef股票<资产方法函数disp (s) disp@Asset (s)%先调用基类disp方法流(1,'股份数:%g\ n股价:%3.2f\n',……s.NumShares s.SharePrice);结束%disp结束结束

使用的局限性

以下限制适用于调用超类方法。你只能在以下情况下使用这个符号:

  • 与要调用的超类方法具有相同名称的方法

  • 一个类,它是您正在调用其方法的超类的子类

调用内置函数

MATLAB内置函数使您能够调用已被方法重载的函数的内置版本。

相关话题