主要内容

验证属性值

类定义中的属性验证

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

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

属性验证的附加信息

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

验证语法

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

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

  • 大小——每个维度的长度,指定为正整数或冒号。冒号表示该维度允许任何长度。分配给属性的值必须符合指定的大小或与指定的大小兼容。有关更多信息,请参见财产规模验证

  • 类——单个MATLAB类的名称。赋给属性的值必须是指定的类,或者可转换为指定的类。使用MATLAB支持的任何MATLAB类或外部定义的类,Java除外®和COM类。有关更多信息,请参见房地产类验证

  • 函数——用逗号分隔的验证函数名称列表。在应用任何可能的类和大小转换后,MATLAB将赋给属性的值传递给每个验证函数。如果验证失败,验证器函数抛出错误,但不返回值。有关更多信息,请参见属性验证功能

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

使用属性的验证

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

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

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

要确保只能为属性分配特定类型的值,请将属性限制为只支持所需类型转换的类型,或者使用验证函数指定属性所允许的确切类,而不是指定属性类型。MATLAB在执行任何验证函数之前都会对类型规范进行评估。有关更多信息,请参见订单的验证

指定有效的默认

确保分配给属性的任何默认值都满足指定验证施加的限制。如果您没有指定默认值,MATLAB通过指定指定类的空对象来创建默认值,如果大小限制不允许使用空默认值,则通过调用默认构造函数来创建默认值。默认构造函数必须返回一个正确大小的对象。

使用属性验证的示例类

ValidateProps类定义了三个带有验证的属性。

classdefValidateProps属性位置(1,3) double {mustBeReal, mustBeFinite}标签(: 1)字符{mustBeMember(标签,{‘高’,‘中等’,‘低’})}“低”状态(1,1) matlab.lang.OnOffSwitchState结束结束
  • 位置必须是一个1 × 3数组的类它的值是实数,有限的数。

  • 标签必须是一个字符要么是向量“高”“媒介”,或“低”

  • 状态类型的枚举成员必须是matlab.lang.OnOffSwitchState类().

验证在实例化

的对象创建ValidateProps类对隐式和显式默认值执行验证:

一个= ValidateProps
位置:[0 0 0]标签:'Low'状态:关闭

当创建对象时,MATLAB:

  • 初始化位置属性值对(0 0 0)满足尺寸和等级的要求。

  • 设置标签属性设置为默认值,“低”.默认值必须是所允许的值集中的一个成员。空字符隐式默认值将导致错误。

  • 设置状态财产类定义的枚举成员matlab.lang.OnOffSwitchState类。

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

订单的验证

当给属性赋值时,包括类定义中指定的默认值,MATLAB按以下顺序执行验证:

  • 类验证——这种验证可以导致到不同类的转换,例如字符字符串.对属性的赋值遵循MATLAB对数组的转换规则。

  • 大小验证——这种验证可以导致大小转换,例如标量展开或列向量到行向量的转换。对指定大小验证的属性的赋值行为与对任何MATLAB数组的赋值行为相同。有关索引赋值的信息,请参见数组索引

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

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

属性验证错误

ValueProp类使用大小、类和函数验证来确保赋值给价值属性是一个非负的双标量。

classdefValueProp属性价值(1,1)双{mustBeNonnegative}= 0结束结束

此语句试图将单元格数组分配给属性。这个赋值违反了类验证。

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

该语句试图将1 × 2的双数组赋值给属性。此赋值违反了大小验证。

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

此语句试图将标量双精度值分配给属性。此赋值会导致函数验证失败,因为函数验证需要一个非负数。

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

验证过程在遇到第一个错误时结束。

抽象属性的验证

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

更改验证时未更新的对象

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

加载操作期间的验证

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

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

的对象来演示此行为,本示例创建、保存并加载MonthTemp类。该类限制AveTemp属性设置为单元格数组。

classdefMonthTemp属性AveTemp细胞结束结束

创建一个MonthTemp对象,并将值赋给AveTemp财产。

一个= MonthTemp;a.AveTemp = {“可能”70};

使用以下命令保存对象保存

保存TemperatureFile一个

属性的验证类更改AveTemp属性的单元格数组容器。地图

classdefMonthTemp属性AveTemp容器。地图结束结束

将保存的对象与新的类定义加载到MATLAB路径上。MATLAB无法将保存的值赋值给AveTemp属性,因为单元格数组,{‘可能’,70},与当前属性值为a的要求不兼容容器。地图对象。MATLAB无法将单元格数组转换为容器。地图

为了解决不兼容问题,MATLAB设置了AveTemp属性设置为当前默认值,该值为空容器。地图对象。

负载TemperatureFile一个a.AveTemp ans = Map属性:Count: 0 KeyType: char ValueType: any

对象分配了不同的值AveTemp属性,因为保存的值现在无效。然而,加载过程抑制了验证错误。

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

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

相关的话题

Baidu
map