主要内容

验证属性值

类定义中的属性验证

马铃薯®属性验证使您能够对属性值设置特定的限制。可以使用验证来约束特性值的类和大小。此外,还可以使用函数建立特性值必须符合的条件。MATLAB定义了一组验证函数,您可以编写自己的验证函数。

属性验证的使用是类定义中的可选。

属性验证的附加信息

有关属性验证的详细信息,请参见属性类和大小验证,属性验证功能, 和属性验证的元数据接口.

验证语法

下面代码中突出显示的区域显示了属性验证的语法。

属性验证包括以下任何一项:

  • 大小-每个维度的长度,指定为正整数或冒号。冒号表示该维度中允许任何长度。指定给属性的值必须符合指定的大小或与指定的大小兼容。有关详细信息,请参阅属性大小验证.

  • 类 - 单个MATLAB类的名称。分配给属性的值必须是指定的类或转换为指定的类。使用MATLAB支持的任何MATLAB类或外部定义的类,除了Java万博1manbetx®和com课程。有关更多信息,请参阅房地产类验证.

  • 函数-以逗号分隔的验证函数名称列表。在应用任何可能的类和大小转换后,MATLAB将分配给属性的值传递给每个验证函数。如果验证失败,验证程序函数会抛出错误,但不会返回值。有关详细信息,请参阅属性验证功能.

    有关MATLAB验证函数的列表,请参阅属性验证功能.

使用属性验证

使用属性验证进行公共属性来控制值用户代码分配给属性。

如果希望将属性值限制为一组固定的标识符,则为这些标识符创建一个枚举类,并将属性约束为这个类。有关枚举类的信息,请参见定义枚举类.

MATLAB类型转换规则适用于属性验证。例如,MATLAB可以强制从一个数值类型转换到另一个数值类型。因此,将属性值限制为特定的数字类型(例如double)并不会阻止将其他数字类型赋值给属性。

为了确保只能为特定类型分配特定类型的值,将属性限制为仅支持所需类型转换的类型或使用验证函数指定属性允许的确切类,而不是指定属性类型。万博1manbetx在执行任何验证函数之前,MATLAB评估类型规范。有关更多信息,请参阅验证顺序.

指定有效的默认值

确保指定给属性的任何默认值满足指定验证施加的限制。如果未指定默认值,MATLAB将通过指定类的空对象或在大小限制不允许使用空默认值的情况下调用默认构造函数来创建默认值。默认构造函数必须返回正确大小的对象。

使用属性验证的示例类

这个验证操作类定义了三个带有验证的属性。

Classdef.验证操作属性地点(1,3)双{mustBeReal,mustBeFinite}标签(1,:) char {mustbemmber(label,{'high','medium','low'})}=“低”陈述(1,1)matlab.lang.OnOffSwitchState结尾结尾
  • 地点必须是类的1×3数组双倍的其值是真实的,有限的数字。

  • 标签必须是A.char矢量要么“高”,'中等的',或“低”.

  • 陈述必须是枚举成员matlab.lang.OnoffSwitchState.班级 (离开)。

实例化验证

创造一个对象验证操作类对隐式和显式默认值执行验证:

a = validateprops.
a=ValidateProps,属性:位置:[0]标签:“低”状态:关闭

创建对象时,MATLAB:

  • 初始化地点财产价值[0 0 0]满足尺寸和档次的要求。

  • 设置标签属性到其默认值,“低”.默认值必须是允许的值集的成员。空的char隐式默认值会导致错误。

  • 设置陈述财产归离开枚举成员由matlab.lang.OnoffSwitchState.班级。

有关MATLAB如何选择默认值的信息,请参阅每个大小和类的默认值.

验证顺序

将值(包括类定义中指定的默认值)指定给特性时,MATLAB按以下顺序执行验证:

  • 类验证 - 此验证可能导致转换为不同的类,例如转换char一串.赋予属性的分配遵循MATLAB转换规则的数组。

  • 大小验证 - 此验证可能导致尺寸转换,例如标量扩展或列向量的标量转换到行向量。指定大小验证的属性分配与对任何MATLAB阵列的分配相同。有关索引分配的信息,请参阅数组索引.

  • 验证器函数-MATLAB将类和大小验证的结果按从左到右的顺序传递给每个验证函数。在调用所有验证函数之前可能会发生错误,从而结束验证过程。

  • Set方法-如果为属性定义了属性集方法,则MATLAB在调用属性集方法之前执行属性验证。对属性集或get方法中的属性的赋值不会再次应用验证。通常,可以使用属性验证替换属性集方法。

属性验证错误

这个valualprop.类使用大小、类和函数验证来确保对价值属性是一个不负的双标量。

Classdef.valualprop.属性价值(1,1)双{mustBeNonnegative}= 0.结尾结尾

此语句尝试将单元数组分配给属性。此分配违反了类验证。

a、 值={10,20};
错误设置类“ValueProp”的属性'值':数据类型无效。值必须是双倍或可转换为双倍。

此语句尝试将1×2双数组分配给属性。此分配违反大小验证。

A.Value = [10 20];
设置类“ValueProp”的属性“Value”时出错:值的大小必须是标量。

此语句试图将标量双精度值赋给属性。这个赋值失败了函数验证,这需要一个非负数。

A.Value = -10;
错误设置类“ValueProp”的属性“值”:值必须是非负的。

验证过程以遇到的第一个错误结束。

抽象属性验证

您可以为抽象属性定义属性验证。验证应用于实现该属性的所有子类。但是,子类不能对其属性的实现使用任何验证。当从多个类继承一个属性的验证时,只有一个超类中的一个抽象属性可以定义验证。所有的超类都不能将属性定义为nonAbstract。

更改验证时未更新的对象

如果在类的对象存在时更改属性验证,MATLAB不会尝试将新的验证应用于现有的属性值。然而,当您对现有对象的属性进行赋值时,MATLAB会应用新的验证。

负载操作期间验证

将对象保存到a时文件中,MATLAB会将所有非默认特性值与对象一起保存。加载对象时,MATLAB将在新创建的对象中恢复这些属性值。

如果类定义更改属性验证,例如加载的属性值不再有效,则MATLAB替换该属性的当前定义的默认值。然而加载函数抑制在从当前类定义中分配默认值之前发生的验证错误。因此,在加载操作期间默默忽略验证错误。

要说明此行为,此示例会创建,保存和加载对象班级。此类限制了Avetemp.属性到单元格数组。

Classdef.属性Avetemp.细胞结尾结尾

创建一个对象,并为Avetemp.财产。

a =月份;a.avetemp = {“五月”,70};

使用保存对象节省.

节省温度文件

编辑属性定义以更改属性的验证类Avetemp.从单元格数组到的属性集装箱。地图.

Classdef.属性Avetemp.集装箱。地图结尾结尾

使用MATLAB路径上的新类定义加载已保存的对象。MATLAB无法将保存的值分配给Avetemp.属性,因为单元格数组,{'May',70},与当前要求属性值为集装箱。地图对象。MATLAB不能将单元阵列转换为集装箱。地图.

要解决不兼容,Matlab设置了Avetemp.加载对象的属性到当前默认值,这是空的集装箱。地图对象。

加载温度文件a.avetemp ans = map特性:计数:0 keytype:char ValueType:任何

加载的对象具有指定给对象的不同值Avetemp.属性,因为保存的值现在无效。但是,加载过程抑制了验证错误。

在更改类定义和重新加载对象时,以防止数据丢失,实现aloadobj方法或类转换器方法,使保存的值满足当前属性验证。

有关保存和加载对象的更多信息,请参见保存和加载对象的过程.

相关的话题