初始化属性值
初始化属性值有两种基本方式:
使用默认值定义属性 - MATLAB® 为每个实例的属性赋予相同的初始值。
在构造函数中设置属性值 - 构造函数为每个实例计算赋值语句,这使得实例可以具有唯一初始属性值。
使用默认值定义属性
您可以使用值或表达式为单个属性赋予默认值。表达式不能包含变量。此示例说明为属性定义默认值的几种方式。
classdef PropExample properties Prop1 Prop2 = "some text" Prop3 = sin(pi/12) Prop4 = datetime.empty Prop5 (1,1) double {mustBePositive} = 1 end end
Prop1- 属性定义不指定默认值,因此 MATLAB 将属性值初始化为空double([])。Prop2- 默认值为字符串标量"some text"。Prop3- 默认值是sin(pi/12)的值。读取此属性会返回计算后的表达式值 (0.2588),而不是表达式本身。有关对指定为默认值的表达式进行计算的详细信息,请参阅Evaluation of Expressions in Class Definitions和Properties Containing Objects。
Prop4- 默认值是空datetime对象。Prop5- 默认值为1,并且属性值通常限制为正双精度标量。当属性定义对属性值指定任何大小、类或验证函数限制时,默认值必须满足这些条件。例如,默认值 0 会在实例化期间导致错误,因为它不满足mustBePositive。有关基于大小、类和验证函数的属性限制的信息,请参阅验证属性值。
注意
MATLAB 在首次需要属性值时(例如,当类首次实例化时)计算默认表达式。然后,相同的默认值用于一个类的所有实例。MATLAB 不会重新计算默认表达式,除非从内存中清除了类定义。
作为默认属性值的句柄对象
当您使用句柄类构造函数创建一个默认属性值时,MATLAB 仅在首次使用类时调用构造函数,然后在所有实例中使用相同的对象句柄作为该属性的默认值。由于所有对象句柄都引用同一个对象,因此您在一个实例中对句柄对象所做的任何更改都会反映在所有实例的句柄对象中。要在每次实例化类时使用句柄对象的新实例初始化属性值,请在构造函数中为属性赋值。
在构造函数中设置属性值
要在类构造函数中为属性赋值,请使用圆点表示法引用构造函数返回的对象(输出变量 obj)和属性名称。
classdef MyClass properties Prop1 end methods function obj = MyClass(intval) obj.Prop1 = intval; end end end
当您在类构造函数中为属性赋值时,MATLAB 会为您创建的每个对象计算赋值语句。如果希望每个对象包含该属性的唯一值,请在构造函数中为属性赋值。
例如,ContainsHandle 将 MyHandleClass 类的唯一句柄对象赋给每个实例的 Prop1。ContainsHandle 通过从其自己的构造函数调用 MyHandleClass 构造函数来实现这一点。
classdef ContainsHandle properties Prop1 end methods function obj = ContainsHandle(keySet,valueSet) obj.Prop1 = MyHandleClass(keySet,valueSet); end end end
有关构造函数方法的详细信息,请参阅在构造函数中引用对象。
构造前的属性验证
MATLAB 在使用构造函数赋值之前会先验证默认属性值。在 properties 代码块中赋予的默认值以及在类构造函数中为属性设置的任何值都必须满足指定的验证。例如,PropInit 将 Prop 限制为正双精度标量,但不赋予默认值。默认情况下,MATLAB 赋予空双精度初始值。
classdef PropInit properties Prop (1,1) double {mustBePositive} end methods function obj = PropInit(positiveInput) obj.Prop = positiveInput; end end end
使用 Prop 的有效值调用类构造函数仍会导致错误,因为 Prop 中存在初始空双精度值。空双精度值不满足验证函数 mustBePositive。
obj = PropInit(2);
Error using implicit default value of property 'Prop' of class 'PropInit': Value must be positive.
为避免此问题,请确保您的属性具有满足验证的默认值,即使您打算在构造函数中覆盖这些值也是如此。