本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

属性访问方法

属性提供对类数据的访问

在 MATLAB® 中,属性可以具有公共访问权限。因此,属性可以提供在类的设计中向用户公开的数据的访问权限。

可使用属性访问方法来提供错误检查功能,或实现属性访问所产生的附带效果。访问方法的示例包括可以在设置属性时更新其他属性值的函数,或是可以在返回值之前转换属性值格式的函数。

您可以使用属性验证来限制属性值的大小、类和其他方面。有关属性验证的信息,请参阅验证属性值

访问方法的性能注意事项

无论何时访问属性值,属性访问方法都会增加函数调用的开销。如果发生在类方法内部的属性访问对性能有重大影响,请定义私有属性来存储值。在方法内部使用这些值,而不进行任何错误检查。对于来自类外部的较代频率的访问,请定义使用访问方法进行错误检查的公共 Dependent 属性。

有关 Dependent 属性的访问方法的信息,请参阅从属属性的 set 和 get 方法

属性 Setter 和 Getter 方法

每当查询属性值或对属性赋值时,属性访问方法都会执行特定代码。这些方法使您能够执行各种操作:

  • 在对属性赋值之前执行代码来执行某些操作,例如:

    • 施加值范围限制(验证属性值

    • 检查类型和维度是否正确

    • 提供错误处理

  • 在返回属性的当前值之前执行代码以执行某些操作,例如:

要控制哪些代码可以访问属性,请参阅属性特性

MATLAB 调用访问方法

注意

您不能直接调用属性访问方法。MATLAB 会在您访问属性值时调用这些方法。

每当您从访问方法外部设置或查询对应的属性值时,属性访问方法都会自动执行。MATLAB 不递归调用访问方法。也就是说,当在 set 方法内部设置属性时,MATLAB 不会调用 set 方法。同样,当在 get 方法内部查询属性值时,MATLAB 不会调用 get 方法。

从属性 meta.property 对象获取 set 和 get 访问方法的函数句柄。meta.property SetMethodGetMethod 属性包含引用这些方法的函数句柄。

对访问方法的限制

定义属性访问方法时应新遵循以下限制:

  • 仅为具体属性(即非抽象属性)定义

  • 仅在定义属性的类中定义(除非属性在该类中是抽象的,此时具体子类必须定义访问方法)。

MATLAB 没有默认 set 或 get 属性访问方法。因此,如果您不定义属性访问方法,MATLAB 软件在对属性赋值或返回属性值之前不会调用任何方法。

定义后,只有 set 和 get 方法可以设置和查询实际属性值。有关 MATLAB 在哪些情形下不会调用属性 set 方法的信息,请参阅调用 set 方法时

注意

属性的 set 和 get 访问方法与用户可调用的 setget 方法(用于通过类实例设置和查询属性值)并不等同。有关用户可调用的 setget 方法的信息,请参阅为属性实现 set/get 接口

访问方法无法调用函数来访问属性

您只能从属性 set 或 get 访问方法内设置和获取属性值。您无法从 set 或 get 方法调用另一个函数并尝试从该函数访问属性值。

例如,调用另一个函数来执行实际工作的匿名函数无法访问属性值。同样,访问函数无法调用另一个函数来访问属性值。

定义访问方法

访问方法有带属性名称的特殊名称。因此,每当引用 PropertyName 时,就会执行 get.PropertyName;每当对 PropertyName 赋值时,就会执行 set.PropertyName

在不指定特性的方法代码块中定义属性访问方法。您无法直接调用这些方法。MATLAB 只会在有代码访问属性时,才会调用这些方法。

属性访问方法不会出现在 methods 命令返回的类方法列表中,也会不包括在 meta.class 对象 Methods 属性中。

访问方法函数句柄

属性 meta.property 对象包含属性 set 和 get 方法的函数句柄。SetMethod 包含 set 方法的函数句柄。GetMethod 包含 get 方法的函数句柄。

meta.property 对象获取这些句柄:

mc = ?ClassName;
mp = findobj(mc.PropertyList,'Name','PropertyName');
fh = mp.GetMethod;

例如,如果类 MyClass 为其 Text 属性定义了 get 方法,则可以从 meta.class 对象获取此函数的函数句柄:

mc = ?MyClass;
mp = findobj(mc.PropertyList,'Name','Text');
fh = mp.GetMethod;

返回值 fh 包含为指定类的指定属性名称定义的 get 方法的函数句柄。

有关定义函数句柄的信息,请参阅创建函数句柄

set 和 get 方法的执行和属性事件

MATLAB 软件在 set 和 get 操作前后生成事件。您可以使用这些事件来通知侦听程序已引用属性值或已为属性赋值。生成事件的时间点如下所示:

  • PreGet - 在调用属性 get 方法之前触发

  • PostGet - 在属性 get 方法返回其值之后触发

如果类计算属性值 (Dependent = true),则其 set 事件的行为就像 get 事件一样:

  • PreSet - 在调用属性 set 方法之前触发

  • PostSet - 在调用属性 set 方法之后触发

如果不计算属性值(默认为 Dependent = false),则使用 set 方法的赋值语句会生成事件:

  • PreSet - 在 set 方法中新赋属性值之前触发

  • PostSet - 在 set 方法中新赋属性值之后触发

有关使用属性事件的信息,请参阅创建属性侦听程序

访问方法和包含数组的属性

您可以对包含数组的属性使用数组索引,而无需直接调用属性的 set 和 get 方法。

对于索引引用:

val = obj.PropName(n);

MATLAB 调用 get 方法以获取引用的值。

对于索引赋值:

obj.PropName(n) = val;

MATLAB:

  • 调用 get 方法以获取属性值

  • 对返回的属性执行索引赋值

  • 将新属性值传递给 set 方法

访问方法和对象数组

当引用或赋值发生在对象数组上时,MATLAB 在循环中调用 set 和 get 方法。在此循环中,MATLAB 始终将标量对象传递给 set 和 get 方法。

使用访问方法修改属性值

如果您要在为属性赋值或返回属性值之前执行一些附加步骤,则属性访问方法非常有用。例如,Testpoint 类使用属性 set 方法检查值的范围。如果在特定范围内,则应用缩放,如果不在,则将其设置为 NaN

属性 get 方法在返回当前值之前应用缩放因子:

classdef Testpoint
   properties
      expectedResult = []
   end
   properties(Constant)
      scalingFactor = 0.001
   end
   methods
      function obj = set.expectedResult(obj,erIn)
         if erIn >= 0 && erIn <= 100
            erIn = erIn.*obj.scalingFactor;
            obj.expectedResult = erIn;
         else
            obj.expectedResult = NaN;
         end
      end
      function er = get.expectedResult(obj)
         er = obj.expectedResult/obj.scalingFactor;
      end
   end
end

相关主题