目录
属性访问方法
属性提供对类数据的访问
在 MATLAB® 中,属性可以具有公共访问权限。因此,属性可以提供在类的设计中向用户公开的数据的访问权限。
可使用属性访问方法来提供错误检查功能,或实现属性访问所产生的附带效果。访问方法的示例包括可以在设置属性时更新其他属性值的函数,或是可以在返回值之前转换属性值格式的函数。
有关访问方法语法的具体信息,可以参考属性get方法和属性set方法。可以使用属性验证来限制属性值的大小、类和其他方面。有关属性验证的信息,可以参考验证属性值。
访问方法的性能注意事项
无论何时访问属性值,属性访问方法都会增加函数调用的开销。如果发生在类方法内部的属性访问对性能有重大影响,请定义私有属性来存储值。在方法内部使用这些值,而不进行任何错误检查。对于来自类外部的较代频率的访问,请定义使用访问方法进行错误检查的公共 Dependent 属性。
有关 Dependent 属性的访问方法的信息,参考从属属性的set和get方法。
属性 set 和 get 方法
每当查询属性值或对属性赋值时,属性访问方法都会执行特定代码。这些方法能够执行各种操作:
-
在对属性赋值之前执行代码来执行某些操作,例如:
-
施加值范围限制(验证属性值)
-
检查类型和维度是否正确
-
提供错误处理
-
-
在返回属性的当前值之前执行代码以执行某些操作,例如:
-
计算不存储值的属性的值(可以参考按需计算数据)
-
更改其他属性的值
-
触发事件(可以参考时间和侦听程序概述)
-
要控制哪些代码可以访问属性,参考属性特性。
MATLAB 调用访问方法
注意:不能直接调用属性访问方法。MATLAB 会在访问属性值时调用这些方法。
每当从访问方法外部设置或查询对应的属性值时,属性访问方法都会自动执行。MATLAB 不递归调用访问方法。也就是说,当在 set 方法内部设置属性时,MATLAB 不会调用 set 方法。同样,当在 get 方法内部查询属性值时,MATLAB 不会调用 get 方法。
从属性meta.property对象获取 set 和 get 访问方法的函数句柄。meta.property SetMethod 和 GetMethod 属性包含引用这些方法的函数句柄。
对访问方法的限制
定义属性访问方法时应新遵循以下限制:
-
仅为具体属性(即非抽象属性)定义
-
仅在定义属性的类中定义(除非属性在该类中是抽象的,此时具体子类必须定义访问方法)。
MATLAB 没有默认 set 或 get 属性访问方法。因此,如果不定义属性访问方法,MATLAB 软件在对属性赋值或返回属性值之前不会调用任何方法。
定义后,只有 set 和 get 方法可以设置和查询实际属性值。有关 MATLAB 在哪些情形下不会调用属性 set 方法的信息,可以参考调用set方法时。
注意:属性的 set 和 get 访问方法与用户可调用的 set 和 get 方法(用于通过类实例设置和查询属性值)并不等同。有关用户可调用的 set 和 get 方法的信息,可以参考为属性实现set/get接口。
访问方法无法调用函数来访问属性
只能从属性set或get访问方法内设置和获取属性值。无法从set或get方法调用另一个函数并尝试从该函数访问属性值。
例如,调用另一个函数来执行实际工作的匿名函数无法访问属性值。同样,访问函数无法调用另一个函数来访问属性值。
定义访问方法
访问方法有带属性名称的特殊名称。因此,每当引用 PropertyName 时,就会执行 get.PropertyName;每当对 PropertyName 赋值时,就会执行 set.PropertyName。
在不指定特性的方法代码块中定义属性访问方法。无法直接调用这些方法。MATLAB 只会在有代码访问属性时,才会调用这些方法。
属性访问方法不会出现在methods命令返回的类方法列表中,也会不包括在 meta.class 对象 Methods 属性中。
访问方法函数句柄
属性meta.property对象包含属性 set 和 get 方法的函数句柄。SetMethod包含set方法的函数句柄。GetMethod包含get方法的函数句柄。
从meta.property对象获取这些句柄:
mc = ?ClassName;
mp = findobj(mc.PropertyList,'Name','
PropertyName
');
fh = mp.GetMethod;
例如,如果类 MyClass 为其Text属性定义了get方法,则可以从 meta.class对象获取此函数的函数句柄:
mc = ?MyClass;
mp = findobj(mc.PropertyList,'Name','Text');
fh = mp.GetMethod;
返回值fh包含为指定类的指定属性名称定义的 get 方法的函数句柄。有关定义函数句柄的信息,可以参考创建函数句柄。
set 和 get 方法的执行和属性事件
MATLAB 软件在 set 和 get 操作前后生成事件。可以使用这些事件来通知侦听程序已引用属性值或已为属性赋值。生成事件的时间点如下所示:
-
PreGet - 在调用属性 get 方法之前触发
-
PostGet - 在属性 get 方法返回其值之后触发
如果类计算属性值 (Dependent = true),则其 set 事件的行为就像 get 事件一样:
-
PreSet - 在调用属性 set 方法之前触发
-
PostSet - 在调用属性 set 方法之后触发
如果不计算属性值(默认为 Dependent = false),则使用 set 方法的赋值语句会生成事件:
-
PreSet - 在 set 方法中新赋属性值之前触发
-
PostSet - 在 set 方法中新赋属性值之后触发
访问方法和包含数组的属性
可以对包含数组的属性使用数组索引,而无需直接调用属性的 set 和 get 方法。
对于索引引用:
val = obj.PropName(n);
MATLAB 调用 get 方法以获取引用的值。
对于索引赋值:
obj.PropName(n) = val;
MATLAB:
-
调用 get 方法以获取属性值
-
对返回的属性执行索引赋值
-
将新属性值传递给 set 方法
访问方法和对象数组
当引用或赋值发生在对象数组上时,MATLAB 在循环中调用 set 和 get 方法。在此循环中,MATLAB 始终将标量对象传递给 set 和 get 方法。
使用访问方法修改属性值
如果要在为属性赋值或返回属性值之前执行一些附加步骤,则属性访问方法非常有用。例如,Testpoint类使用属性set方法检查值的范围。如果在特定范围内,则应用缩放,如果不在,则将其设置为NaN。
属性get方法在返回当前值之前应用缩放因子:
classdef Testpoint
properties
expectedResult = []
end
properties(Constant)
scalingFactor = 0.001
end
methods
function obj = set.expectedResult(obj,erIn)
if erIn >= 0 && erIn <= 100
erIn = erIn.*obj.scalingFactor;
obj.expectedResult = erIn;
else
obj.expectedResult = NaN;
end
end
function er = get.expectedResult(obj)
er = obj.expectedResult/obj.scalingFactor;
end
end
end