本页面提供的是上一版软件的文档。当前版本中已删除对应的英文页面。
属性访问方法
属性提供对类数据的访问
在 MATLAB® 中,属性可以具有公共访问权限。因此,属性可以提供在类的设计中向用户公开的数据的访问权限。
可使用属性访问方法来提供错误检查功能,或实现属性访问所产生的附带效果。访问方法的示例包括可以在设置属性时更新其他属性值的函数,或是可以在返回值之前转换属性值格式的函数。
有关访问方法语法的具体信息,请参阅属性 get 方法和属性 set 方法。
您可以使用属性验证来限制属性值的大小、类和其他方面。有关属性验证的信息,请参阅验证属性值。
访问方法的性能注意事项
无论何时访问属性值,属性访问方法都会增加函数调用的开销。如果发生在类方法内部的属性访问对性能有重大影响,请定义私有属性来存储值。在方法内部使用这些值,而不进行任何错误检查。对于来自类外部的较代频率的访问,请定义使用访问方法进行错误检查的公共 Dependent
属性。
有关 Dependent
属性的访问方法的信息,请参阅从属属性的 set 和 get 方法。
属性 set 和 get 方法
每当查询属性值或对属性赋值时,属性访问方法都会执行特定代码。这些方法使您能够执行各种操作:
在对属性赋值之前执行代码来执行某些操作,例如:
施加值范围限制(验证属性值)
检查类型和维度是否正确
提供错误处理
在返回属性的当前值之前执行代码以执行某些操作,例如:
要控制哪些代码可以访问属性,请参阅属性特性。
当 MATLAB 调用访问方法时
每当您从访问方法外部设置或查询对应的属性值时,属性访问方法都会自动执行。MATLAB 不以递归方式调用访问方法。也就是说,当在属性的 set 方法内部设置属性时,不论正在修改的是类的什么实例,MATLAB 都不会调用 set 方法。同样,当在属性的 get 方法内部查询属性值时,MATLAB 也不会调用该属性的 get 方法。
注意
您不能直接调用属性访问方法。MATLAB 会在您访问属性值时调用这些方法。
从属性 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