目录
属性定义
能定义什么
通过以下方式控制属性定义的各个方面:
-
分别为每个属性指定默认值,参考默认属性值。
-
在类构造函数中为属性赋值,参考在构造函数中为属性赋值。
-
用常量值定义属性,参考Named Value。
-
按代码块为属性特性赋值,参考属性特性。
-
定义设置或查询属性时执行的方法,参考设置和获取属性值的方法。
-
定义属性值的类和大小,参考验证属性值。
-
定义不存储值但其值取决于其他属性的属性,参考属性的类型。
注意:属性不能与类具有相同的名称。请务必在 MATLAB® 代码中使用区分大小写的属性名称。
初始化属性值
初始化属性值有两种基本方式:
-
在属性定义中 - MATLAB 只对表达式执行一次计算,并为每个实例的属性指定相同的值。
-
在类构造函数中 - MATLAB 计算每个实例的赋值表达式,以确保每个实例都有唯一的值。
属性默认值
在 properties 代码块中,可以控制单个属性的默认值。以值或 MATLAB 表达式形式指定默认值。表达式无法引用变量。例如:
-
Prop1 - 没有赋值会导致默认值为空,即 []
-
Prop2 - 将字符数组指定为默认值
-
Prop3 - 将表达式结果指定为默认值
-
Prop4 - 为该类所有实例的 Prop4 赋予同一句柄类实例
-
Prop5 - 赋予该属性一个满足双精度正值标量的限制的默认值。
classdef ClassName
properties
Prop1
Prop2 = 'some text'
Prop3 = sin(pi/12)
Prop4 = containers.Map
Prop5 (1,1) double {mustBePositive} = 1
end
end
如果类定义没有指定默认属性值,MATLAB 将属性值初始化为空 double ([])。如果类为属性值指定了任何类、大小或验证函数限制,则当空值无效时,该类必须通过赋予有效值来确保默认值满足这些限制。
注意:属性默认值的计算仅在首次需要该值时进行,并且仅在 MATLAB 首次初始化类时进行一次。MATLAB 不会在每次创建类的实例时重新计算表达式。
将属性初始化为句柄对象
MATLAB 仅在 MATLAB 加载类定义时将指定的默认值赋给属性。如果使用句柄类构造函数创建属性默认值,MATLAB 仅在首次使用该类时调用构造函数,之后便会在创建的所有对象中使用同一对象句柄作为该属性的默认值。由于所有对象句柄引用同一个对象,因此在一个实例中对句柄对象所做的任何更改都会导致所有实例中的句柄对象发生更改。
如果希望每次创建类的对象时都将属性值初始化为句柄对象的新实例,请在构造函数中为属性赋值。
在构造函数中为属性赋值
要在类构造函数中为属性赋值,请使用圆点表示法引用构造函数返回的对象(输出变量obj)和属性名称:
classdef MyClass
properties
Prop1
end
methods
function obj = MyClass(intval)
% Initialize Prop1 for each instance
obj.Prop1 = intval;
end
end
end
当类构造函数中为属性赋值时,MATLAB会创建的每个对象计算赋值语句。如果希望每个对象包含该属性的唯一值,请在构造函数中为属性赋值。
例如,假设希望每次创建一个其他对象时,使用另一个唯一句柄对象为该对象的属性赋值。在构造函数中使用句柄对象为属性赋值。调用句柄对象构造函数,为类的每个实例创建唯一的句柄对象。
classdef ContainsHandle
properties
Prop1
end
methods
function obj = ContainsHandle(keySet,valueSet)
obj.Prop1 = MyHandleClass(keySet,valueSet);
end
end
end
默认值计算先于对象构造
MATLAB在使用构造函数赋值之前会先验证属性默认值。properties模块中所赋的默认值和类构造函数中设置的属性值必须满足指定的验证。例如,以下类将Prop限制为正双精度标量,但不赋予有效的默认值。默认情况下,MATLAB赋予空的双精度默认值,这会导致运行时错误。
classdef PropInit
properties
% Error without valid default value
Prop (1,1) double {mustBePositive}
% Empty default fails mustBePositive
end
methods
function obj = PropInit(positiveInput)
obj.Prop = positiveInput;
end
end
end
即便使用 Prop 的有效值调用类构造函数,验证函数mustBePositive仍会出错。
obj = PropInit(2);
Error using implicit default value of property 'Prop' of class 'PropInit':
Value must be positive.
属性特性
所有属性都有特性,用于修改属性行为的某些方面。指定的特性适用于特定属性代码块中的所有属性。例如:
classdef ClassName
properties (PropertyAttribute = value)
Prop1
Prop2
end
end
例如,只有同一类定义中的方法才能修改和查询 Salary 和 Password 属性。
classdef EmployeeInfo
properties (Access = private)
Salary
Password
end
end
之所以存在此限制,是因为该类在 Access 特性设置为 private 的 properties 代码块中定义这些属性。
属性特性
可以指定的属性特性的说明,可以参考属性特性。
设置和获取属性值的方法
无论何时设置或查询属性值,MATLAB 都会调用属性访问方法。在 methods 代码块中定义属性 set 或 get 访问方法,这些代码块不指定特性并具有以下语法:
methods
function obj = set.PropertyName(obj,value)
...
end
function value = get.PropertyName(obj)
...
end
end
在属性定义代码块中使用指定的默认值赋值时,MATLAB 不调用属性 set 访问方法。
例如,set.Password 方法测试赋给 Password 属性的字符数组的长度。如果赋给属性的值少于 7 个字符,MATLAB 将返回错误。否则,MATLAB 将指定的值赋给该属性。
function obj = set.Password(obj,pw)
if numel(pw) < 7
error('Password must have at least 7 characters')
else
obj.Password = pw;
end
使用变量引用对象属性
MATLAB 可以使用以下形式的表达式从char变量解析属性名称:
object.(PropertyNameVar)
其中PropertyNameVar是包含有效对象属性名称的变量。将属性名称作为参数传递时,请使用以下语法。例如,getPropValue函数返回KeyType属性的值:
PropName = 'KeyType';
function o = getPropValue(obj,PropName)
o = obj.(PropName);
end