我是使用MATLAB作为面向对象环境的新手,我正在写第一堂课来描述网络数据包。一个简单的例子如下
classdef Packet
properties
HeaderLength
PayloadLength
PacketType
end
end
我想明确指出HeaderLength
和PayloadLength
都是uint16,PacketType
是字符串。有没有办法做到这一点?
答案 0 :(得分:21)
存在undocumented syntax强制执行属性类型:
classdef Packet
properties
HeaderLength@uint16
PayloadLength@uint16 = uint16(0);
PacketType@char
end
end
如果您尝试使用错误的类型设置属性,则会出现错误:
>> p = Packet;
>> p.PacketType = 'tcp';
>> p.HeaderLength = 100;
While setting the 'HeaderLength' property of Packet:
Value must be 'uint16'.
据我所知,这种语法支持所有原始类型,如:char, int32, double, struct, cell, ...
,除了任何用户定义的类型(只使用任何类名)。
请注意,如上所述设置类型似乎会覆盖任何“set method”。
我刚刚看到这个语法在R2013a(toolboxdir('matlab')\graphics\+graphics\+internal\+figfile\@FigFile\FigFile.m
)的内部类中使用,但它也适用于R2012a,也可能是旧版本......
答案 1 :(得分:7)
现在正式支持“Restrict Property Values to Specific Classes”功能since R2016a。它与Amro's answer中描述的旧的未记录语法类似。
classdef Packet
properties
HeaderLength uint16
PayloadLength uint16 = uint16(0);
PacketType char
end
end
与先前版本的兼容性
R2016a支持两种语法选项,我注意到它们之间没有区别。但是,它们与R2015b中基于“@”的语法略有不同:
在R2015b中,继承自myProp
的类MyPropClass2
的对象MyPropClass1
完美地通过了“类限制”检查,然后“按原样”存储。因此,整个过程就像添加到属性集方法isa(newPropVal,MyPropClass1)
MyPropClass1
检查一样
如果R2016a“将属性值限制为特定类”语法,Matlab会将所述对象转换为指定的类。这需要MyPropClass1
的适当构造函数,这意味着MyPropClass1
不能是Abstract
。
示例:
classdef MyPropClass1
methods
% The following method is only used in R2016a case
function obj=MyPropClass1(val)
end
end
end
------------------------------------------------------------
classdef MyPropClass2 < MyPropClass1
end
------------------------------------------------------------
classdef MyObjClass
properties
someprop@MyPropClass1
end
end
------------------------------------------------------------
myObj = MyObjClass();
myObj.someprop = MyPropClass2;
% The following displays "MyPropClass1" in R2016a, and "MyPropClass2" in R2015b
disp(class(myObj.someprop));
与类层次结构的兼容性
在R2016a和R2015b中,无法在嵌套类中重新定义“将属性值限制为特定类”限定符。例如。不可能定义类似的东西:
classdef MyObjClass2 < MyObjClass
properties
someprop@MyPropClass2
end
end
答案 2 :(得分:6)
由于无法在Matlab中明确指定变量类型,因此在声明属性时无法执行此操作。
但是,您可以定义一个set方法来检查类,并抛出错误或将输入转换为您想要的任何内容。
例如
classdef myClass
properties
myProperty = uint16(23); %# specify default value using correct type
end
methods
function obj = set.myProperty(obj,val)
if ~isa(val,'uint16')
error('only uint16 values allowed')
end
%# assign the value
obj.myProperty = val;
end
end
end