MATLAB®属性验证使您能够对属性值施加特定的限制。您可以使用验证来约束属性值的类和大小。此外,您可以使用函数来建立属性值必须符合的标准。MATLAB定义了一组验证函数,您可以编写自己的验证函数。
属性验证的使用在类定义中是可选的。
有关属性验证的详细信息,请参见属性类和大小验证,属性验证函数,属性验证的元数据接口.
下面代码中突出显示的区域显示了属性验证的语法。
属性验证包括以下任何一项:
大小-每个维度的长度,指定为正整数或冒号。冒号表示该维度允许任何长度。赋给属性的值必须符合指定的大小或与指定的大小兼容。有关更多信息,请参见属性大小验证.
类-一个MATLAB类的名称。赋给属性的值必须是指定的类或可转换为指定的类。使用MATLAB支持的任何MATLAB类或外部定义的类,Java除外金宝app®和COM类。有关更多信息,请参见属性类验证.
函数——以逗号分隔的验证函数名列表。MATLAB在应用任何可能的类和大小转换后,将赋给属性的值传递给每个验证函数。验证器函数在验证失败时抛出错误,但不返回值。有关更多信息,请参见属性验证函数.
有关MATLAB验证函数的列表,请参见属性验证函数.
使用公共属性的属性验证来控制用户代码分配给属性的值。
如果希望将属性值限制为一组固定的标识符,请为这些标识符创建一个枚举类,并将属性约束为该类。有关枚举类的信息,请参见定义枚举类.
MATLAB类型转换规则适用于属性验证。例如,MATLAB可以从一种数字类型转换为另一种数字类型。因此,将属性值限制为特定的数字类型(如double)并不会阻止将其他数字类型赋值给该属性。
若要确保只能为属性分配特定类型的值,请将属性限制为仅支持所需类型转换的类型,或使用验证函数指定属性所允许的确切类,而不是指定属性类型。金宝appMATLAB在执行任何验证函数之前评估类型规范。有关更多信息,请参见验证顺序.
确保分配给属性的任何默认值满足指定验证施加的限制。如果没有指定默认值,MATLAB将通过为指定类分配一个空对象来创建默认值,或者如果大小限制不允许使用空默认值,则通过调用默认构造函数来创建默认值。默认构造函数必须返回正确大小的对象。
的ValidateProps
类定义了三个带有验证的属性。
classdefValidateProps属性位置(1,3) double {mustBeReal, mustbesfinite}标签(: 1)字符{mustBeMember(标签,{‘高’,‘中等’,‘低’})}=“低”状态(1,1) matlab.lang.OnOffSwitchState结束结束
位置
必须是一个1乘3的类数组双
它们的值是实数,有限的数。
标签
一定是字符
向量是“高”
,“媒介”
,或“低”
.
状态
类型的枚举成员matlab.lang.OnOffSwitchState
类(从
或在
).
对象的对象ValidateProps
类对隐式和显式默认值执行验证:
a = ValidateProps
a = ValidateProps with properties: Location: [0 0 0 0] Label: 'Low' State: off
创建对象时,MATLAB:
初始化位置
物业价值[0 0 0]
以满足尺寸和等级的要求。
设置标签
属性设置为默认值,“低”
.默认值必须是允许的值集的成员。空字符
隐式默认值将导致错误。
设置状态
属性从
属性定义的枚举成员matlab.lang.OnOffSwitchState
类。
有关MATLAB如何选择默认值的信息,请参见每个大小和类的默认值.
当一个值被赋给属性时,包括类定义中指定的默认值,MATLAB按以下顺序执行验证:
类验证——这种验证可以导致转换到不同的类,例如类的转换字符
来字符串
.属性的赋值遵循数组的MATLAB转换规则。
大小验证——此验证可以导致大小转换,例如标量展开或将列向量转换为行向量。对指定大小的属性的赋值验证行为与对任何MATLAB数组的赋值相同。有关索引赋值的信息,请参见数组索引.
验证器函数——MATLAB将类和大小验证的结果按照从左到右的顺序传递给每个验证函数。在调用所有验证函数之前可能会发生错误,从而结束验证过程。
设置方法——MATLAB在调用属性集方法之前执行属性验证,如果为该属性定义了一个属性集方法。在属性集或获取方法中对属性的赋值不会再次应用验证。通常,可以使用属性验证替换属性集方法。
的ValueProp
类使用大小、类和函数验证来确保对价值
属性为非负的双标量。
classdefValueProp属性价值(1,1) double {mustBeNonnegative}= 0结束结束
此语句试图将单元格数组分配给属性。这个赋值违反了类验证。
a.Value = {10,20};
设置类ValueProp的属性“Value”错误:无效的数据类型。Value必须为double或可转换为double。
此语句试图将1 × 2双数组分配给属性。这个赋值违反了大小验证。
a.Value = [10 20];
设置类ValueProp的属性“Value”错误:值的大小必须是标量。
此语句试图将标量double赋给属性。此赋值不能执行函数验证,因为函数验证需要一个非负数。
a.Value = -10;
设置类ValueProp的属性“Value”错误:值必须是非负的。
验证过程在遇到第一个错误时结束。
您可以为抽象属性定义属性验证。验证应用于实现该属性的所有子类。但是,子类不能在其属性的实现上使用任何验证。当从多个类继承属性的验证时,只有一个超类中的一个抽象属性可以定义验证。所有超类都不能将属性定义为nonAbstract。
如果在类的对象存在时更改属性验证,MATLAB不会尝试将新的验证应用于现有的属性值。但是,MATLAB在对现有对象的属性进行赋值时应用了新的验证。
将对象保存到垫
文件,MATLAB保存对象的所有非默认属性值。加载对象时,MATLAB会在新创建的对象中恢复这些属性值。
如果类定义更改了属性验证,使得加载的属性值不再有效,MATLAB将该属性替换为当前定义的默认值。然而,负载
函数抑制在从当前类定义分配默认值之前发生的验证错误。因此,在加载操作期间,验证错误将被无声地忽略。
属性的对象创建、保存和加载MonthTemp
类。该类限制AveTemp
属性设置为单元格数组。
classdefMonthTemp属性AveTemp细胞结束结束
创建一个MonthTemp
对象,并将值赋给AveTemp
财产。
a = MonthTemp;a.AveTemp = {“可能”70};
使用保存
.
保存TemperatureFile一个
属性的验证类AveTemp
属性容器。地图
.
classdefMonthTemp属性AveTemp容器。地图结束结束
在MATLAB路径上加载带有新类定义的已保存对象。的保存值AveTemp
属性,因为单元格数组,{‘可能’,70}
,与当前要求属性值为a的要求不兼容容器。地图
对象。MATLAB无法将单元格数组转换为容器。地图
.
为了解决不兼容性,MATLAB设置AveTemp
属性设置为当前默认值,该值为空容器。地图
对象。
负载TemperatureFile一个a.AveTemp ans = Map与属性:计数:0 KeyType: char ValueType: any
对象的赋值不同AveTemp
属性,因为保存的值现在无效。然而,加载过程抑制了验证错误。
为防止在更改类定义和重新加载对象时丢失数据,实现aloadobj
方法或类转换器方法,使保存的值满足当前属性验证。
有关保存和加载对象的详细信息,请参见对象的保存和加载过程.