从属属性的 set 和 get 方法
从属属性不存储数据。从属属性的值取决于一些其他值,例如非从属属性的值。
从属属性必须定义 get 访问方法 (get.
),以便在查询属性时确定属性的值。 PropertyName
使用 isequal
和 isequaln
测试对象相等性时,不考虑从属属性 get 方法返回的值。
要能够设置从属属性的值,该属性必须定义 set 访问方法 (set.
)。属性 set 访问方法通常将值赋给另一个非从属属性来存储值。PropertyName
例如,Account
类返回从属属性 Balance
的值,该值取决于 Currency
属性的值。在计算 Balance
属性的值之前,get.Balance
方法会先查询 Currency
属性。
在查询 Balance
属性时,MATLAB® 才会调用 get.Balance
方法。您无法显式调用 get.Balance
。
下面列出了显示从属属性及其 get 方法的类的部分代码:
classdef Account properties Currency DollarAmount end properties (Dependent) Balance end ... methods function value = get.Balance(obj) c = obj.Currency; switch c case 'E' v = obj.DollarAmount / 1.1; case 'P' v = obj.DollarAmount / 1.5; otherwise v = obj.DollarAmount; end format bank value = v; end end end
计算从属属性值
属性 get 方法有一个用处是仅在需要时才确定属性的值,可以避免存储属性值。要使用这种方法,请将属性 Dependent
特性设置为 true
:
properties (Dependent = true) Prop end
Prop
属性的 get 方法确定该属性的值,并将其从方法中赋给对象:
function value = get.Prop(obj) value = calculateValue; ... end
此 get
方法调用名为 calculateValue
的函数或静态方法来计算属性值,并返回 value
作为结果。属性 get 方法可以在方法中采取任何必要的操作来生成输出值。
有关属性 get 方法的示例,请参阅按需计算数据。
何时对从属属性使用 set 方法
虽然从属属性不存储其值,但是,可以为从属属性定义 set 方法,以使代码能够设置属性。
例如,propertyChange
是一个值类,它将属性的名称从 OldPropName
更改为 NewPropName
。您可以继续允许使用旧名称,而不将其公开给新用户。要支持旧属性名称,请使用 set 和 get 方法将 OldPropName
定义为从属属性。与非从属属性一样,值类中的 set 方法必须返回修改后的对象。
classdef propertyChange properties NewPropName end properties (Dependent, Hidden) OldPropName end methods function obj = set.OldPropName(obj,val) obj.NewPropName = val; end function value = get.OldPropName(obj) value = obj.NewPropName; end end end
这样,同时存储新旧属性值便不会浪费内存。访问 OldPropName
的代码继续按预期工作。设置 OldPropName
的 Hidden
特性会阻止新用户查看该属性。
属性 set 方法进行的赋值运算会使系统执行为要设置的属性定义的所有 set 方法。有关示例,请参阅按需计算数据。
具有从属属性的私有 set 访问权限
如果仅使用从属属性返回值,则不要为从属属性定义 set 访问方法。此时,请将从属属性的 SetAccess
特性设置为 private
。以 MaxValue
属性的以下 get 方法为例:
methods function mval = get.MaxValue(obj) mval = max(obj.BigArray(:)); end end
此示例使用 MaxValue
属性返回仅在查询时才计算的值。对于此用法,请将 MaxValue
属性定义为 dependent 和 private:
properties (Dependent, SetAccess = private) MaxValue end