Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

属性定义

您能定义什么

通过以下方式控制属性定义的各个方面:

注意

属性不能与类具有相同的名称。

注意

请务必在 MATLAB® 代码中使用区分大小写的属性名称。

初始化属性值

初始化属性值有两种基本方式:

  • 在属性定义中 - MATLAB 只对表达式执行一次计算,并为每个实例的属性指定相同的值。

  • 在类构造函数中 - MATLAB 计算每个实例的赋值表达式,以确保每个实例都有唯一的值。

有关对指定为属性默认值的表达式进行计算的详细信息,请参阅When MATLAB Evaluates Expressions

属性默认值

properties 代码块中,您可以控制单个属性的默认值。以值或 MATLAB 表达式形式指定默认值。表达式无法引用变量。例如:

  • Prop1 - 没有赋值会导致默认值为空,即 []

  • Prop2 - 将字符数组指定为默认值

  • Prop3 - 将表达式结果指定为默认值

  • Prop4 - 将一个空的 datetime 对象赋给 Prop4

  • Prop5 - 赋予该属性一个满足双精度正值标量的限制的默认值。

classdef ClassName
   properties
      Prop1
      Prop2 = 'some text'
      Prop3 = sin(pi/12)
      Prop4 = datetime.empty 
      Prop5 (1,1) double {mustBePositive} = 1
   end
end

如果类定义没有指定默认属性值,MATLAB 将属性值初始化为空 double ([])。如果类为属性值指定了任何类、大小或验证函数限制,则当空值无效时,该类必须通过赋予有效值来确保默认值满足这些限制。

注意

属性默认值的计算仅在首次需要该值时进行,并且仅在 MATLAB 首次初始化类时进行一次。MATLAB 不会在每次创建类的实例时重新计算表达式。

有关对指定为属性默认值的表达式进行计算的详细信息,请参阅Evaluation of Expressions in Class DefinitionsProperties Containing Objects

有关属性定义中使用的类、大小和验证函数的信息,请参阅验证属性值

将属性初始化为句柄对象

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

例如,只有同一类定义中的方法才能修改和查询 SalaryPassword 属性。

classdef EmployeeInfo
   properties (Access = private)
      Salary
      Password
   end
end

之所以存在此限制,是因为该类在 Access 特性设置为 privateproperties 代码块中定义这些属性。

属性特性

有关您可以指定的属性特性的说明,请参阅属性特性

设置和获取属性值的方法

无论何时设置或查询属性值,MATLAB 都会调用属性访问方法。在 methods 代码块中定义属性 set 或 get 访问方法,这些代码块不指定特性并具有以下语法:

methods

   function obj = set.PropertyName(obj,value)
      ...
   end

   function value = get.PropertyName(obj)
      ...
   end

end

有关访问方法语法的具体信息,请参阅属性 get 方法属性 set 方法

在属性定义代码块中使用指定的默认值赋值时,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

相关主题