主要内容

属性访问方法

属性提供对类数据的访问

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

使用属性访问方法提供错误检查或实现由属性访问产生的副作用。访问方法的示例包括在设置属性时更新其他属性值或在返回属性值之前转换属性值的格式的函数。

有关访问方法语法的具体信息,请参见属性获取方法属性集方法

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

访问方法的性能考虑

每当访问属性值时,属性访问方法确实会增加函数调用的开销。如果对属性的性能至关重要的访问发生在类的方法内部,则定义私有属性来存储值。在方法中使用这些值而不进行任何错误检查。对于来自类外部的不太频繁的访问,定义public依赖使用访问方法进行错误检查的属性。

使用的访问方法的信息依赖属性,看到设置和获取从属属性的方法

属性设置和获取方法

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

  • 在分配属性值之前执行代码以执行以下操作:

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

    • 检查正确的类型和尺寸

    • 提供错误处理

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

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

MATLAB调用访问方法

每当从访问方法外部设置或查询相应的属性值时,都会自动执行属性访问方法。MATLAB不递归地调用访问方法。也就是说,MATLAB在从属性的set方法中设置属性时不调用set方法,无论正在修改的是类的哪个实例。类似地,当从该属性自己的get方法中查询属性值时,MATLAB不调用get方法。

请注意

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

获取集合的函数句柄,并从属性获取访问方法meta.property对象。的meta.propertySetMethodGetMethod属性包含引用这些方法的函数句柄。

访问方法限制

只定义属性访问方法:

  • 对于具体属性(即非抽象属性)

  • 在定义属性的类中(除非属性在该类中是抽象的,在这种情况下,具体的子类必须定义访问方法)。

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

定义后,只有set和get方法可以设置和查询实际的属性值。看到当Set方法被调用时获取关于MATLAB不调用属性集方法的信息。

请注意

属性set和get访问方法不等同于用户可调用的得到用于从类的实例设置和查询属性值的方法。看到实现属性的设置/获取接口有关用户可调用的信息得到方法。

访问方法不能调用函数来访问属性

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

例如,调用另一个函数来完成实际工作的匿名函数不能访问属性值。类似地,访问函数不能调用另一个函数来访问属性值。

定义访问方法

访问方法具有特殊的名称,其中包括属性名称。因此,得到的。PropertyName执行的时候PropertyName被引用和集。PropertyName执行的时候PropertyName被赋值。

在不指定任何属性的方法块中定义属性访问方法。你不能直接调用这些方法。当任何代码访问属性时,MATLAB都会调用这些方法。

类返回的类方法列表中不显示属性访问方法方法命令,并且不包含在meta.class对象方法财产。

访问方法函数句柄

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

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

MC = ?类名称;Mp = findobj(mc;PropertyList,“名字”PropertyName);fh = mp.GetMethod;

例如,如果类MyClass定义一个get方法文本属性中获取此函数的函数句柄meta.class对象:

mc = ?Mp = findobj(mc;PropertyList,“名字”“文本”);fh = mp.GetMethod;

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

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

设置和获取方法执行和属性事件

MATLAB软件生成set和get操作前后的事件。您可以使用这些事件通知侦听器已经引用或分配了属性值。事件生成的时间安排如下:

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

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

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

  • 预设-在调用属性集方法之前触发

  • PostSet—在调用属性集方法后触发

如果没有计算属性(依赖= false(默认值),然后使用set方法的赋值语句生成事件:

  • 预设-在set方法中分配新属性值之前触发

  • PostSet-在set方法中分配新的属性值后触发

有关使用属性事件的信息,请参见创建属性侦听器

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

可以对包含数组的属性使用数组索引,而不会干扰属性set和get方法。

索引参考:

Val = obj。PropNamen);

MATLAB调用get方法来获取引用值。

对于索引赋值:

obj。PropNamen) = val;

MATLAB:

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

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

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

对象的访问方法和数组

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

使用访问方法修改属性值

如果您希望在分配或返回属性值之前执行一些附加步骤,则属性访问方法非常有用。例如,测试点类使用属性集方法检查值的范围。然后,如果它在特定范围内,则应用缩放,并将其设置为如果不是。

属性get方法在返回当前值之前应用一个比例因子:

classdef测试点属性expectedResult = []结束属性(常数)scalingFactor = 0.001结束方法函数obj = set.expectedResult(obj,erIn)如果erIn >= 0 && erIn <= 100 erIn = erIn.*obj.scalingFactor;obj。expectedResult = erIn;其他的obj。expecteresult = NaN;结束结束函数er = get. expectedreresult (obj) er = obj. expectedreresult /obj. scalingfactor;结束结束结束

相关的话题

Baidu
map