当MATLAB®调用具有参数列表的普通方法,它使用以下条件来确定要调用的方法
如果最左边的参数的类没有指定为低于任何其他参数的类,那么它的类将被选择为主导类,并调用它的方法。
如果这个类没有定义被调用的方法,那么就会调用MATLAB路径上的同名函数。
如果不存在这样的函数,MATLAB将发出一个错误,表明主导类没有定义命名方法。
MATLAB使用主导参数调度来确定调用哪个版本的方法。在方法调度期间,MATLAB从调用中的参数中确定主导类。一般来说,所有MATLAB类使用classdef
对于方法调度而言,语法具有同样的优先级。
类使用classdef
语法优先于这些MATLAB类:
双
,单
,int64
,uint64
,int32
,uint32
,int16
,uint16
,int8
,uint8
,字符
,字符串
,逻辑
,细胞
,结构体
,function_handle
.
通常,当参数列表中包含两个或多个对象时,将调用为最左边对象的类定义的方法。然而,用户定义的类可以指定特定类的相对优势。信息,请参阅类优先.
例如,假设classA
定义了classB
并假设两个类都定义了一个被调用的方法结合
.
调用带有对象的方法classB
和classA
:
结合(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,最长,…)
使用这种表示法,您可以以创建对的字段的动态引用的相同方式创建对属性和方法的动态引用结构体
.
例如,假设一个对象有对应于一周中每一天的方法。这些方法的名称与星期相同(周一
,周二
,等等)。此外,这些方法如下所示:字符
向量输入参数,当月的当前日期(日期)。现在假设您编写了一个函数,希望在其中为当天调用正确的方法。
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内置
函数使您能够调用已被方法重载的函数的内置版本。