Main Content

从属属性的 set 和 get 方法

从属属性不存储数据。从属属性的值取决于一些其他值,例如非从属属性的值。

从属属性必须定义 get 访问方法 (get.PropertyName),以便在查询属性时确定属性的值。

使用 isequalisequaln 测试对象相等性时,不考虑从属属性 get 方法返回的值。

要能够设置从属属性的值,该属性必须定义 set 访问方法 (set.PropertyName)。属性 set 访问方法通常将值赋给另一个非从属属性来存储值。

例如,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 的代码继续按预期工作。设置 OldPropNameHidden 特性会阻止新用户查看该属性。

属性 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

相关主题