我是新手使用MATLAB作为面向对象的环境,我正在写第一堂课来描述网络数据包.一个简单的例子如下
classdef Packet
properties
HeaderLength
PayloadLength
PacketType
end
end
Run Code Online (Sandbox Code Playgroud)
我想明确指出,HeaderLength并且PayloadLength都是uint16并且PacketType是一个字符串.有没有办法做到这一点?
Amr*_*mro 22
存在一个未记录的语法来强制执行属性类型:
classdef Packet
properties
HeaderLength@uint16
PayloadLength@uint16 = uint16(0);
PacketType@char
end
end
Run Code Online (Sandbox Code Playgroud)
如果您尝试使用错误的类型设置属性,则会收到错误:
>> p = Packet;
>> p.PacketType = 'tcp';
>> p.HeaderLength = 100;
While setting the 'HeaderLength' property of Packet:
Value must be 'uint16'.
Run Code Online (Sandbox Code Playgroud)
据我所知,这种语法支持所有原始类型,如:char, int32, double, struct, cell, ...,除了任何用户定义的类型(只使用任何类名).
请注意,如上所述设置类型似乎会覆盖任何"set method"(如果有).
我刚刚在R2013a(toolboxdir('matlab')\graphics\+graphics\+internal\+figfile\@FigFile\FigFile.m)的内部类中使用过这种语法,但它也适用于R2012a,也可能是旧版本......
自R2016a起,现在正式支持"将属性值限制为特定类 "功能.它与Amro的答案中描述的旧的未记录语法类似.
classdef Packet
properties
HeaderLength uint16
PayloadLength uint16 = uint16(0);
PacketType char
end
end
Run Code Online (Sandbox Code Playgroud)
与先前版本的兼容性
R2016a支持两种语法选项,我注意到它们之间没有区别.但是,它们与R2015b中基于"@"的语法略有不同:
在R2015b中,继承自myProp的类的对象完美地通过"类限制"检查,然后"按原样"存储.因此,整个过程就像添加到属性集方法的显式检查一样MyPropClass2MyPropClass1isa(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));
Run Code Online (Sandbox Code Playgroud)
与类层次结构的兼容性
在R2016a和R2015b中,无法在嵌套类中重新定义"将属性值限制为特定类"限定符.例如,无法定义如下内容:
classdef MyObjClass2 < MyObjClass
properties
someprop@MyPropClass2
end
end
Run Code Online (Sandbox Code Playgroud)
由于无法在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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3314 次 |
| 最近记录: |