我可以在MATLAB中为类属性分配类型吗?

Pho*_*non 13 oop matlab class

我是新手使用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,也可能是旧版本......

  • [交叉引用](http://undocumentedmatlab.com/blog/setting-class-property-types) (6认同)

Igo*_*gor 7

自R2016a起,现在正式支持"将属性值限制为特定类 "功能.它与Amro的答案中描述的旧的未记录语法类似.

classdef Packet
    properties
        HeaderLength uint16
        PayloadLength uint16 = uint16(0);
        PacketType char
    end
end
Run Code Online (Sandbox Code Playgroud)

与先前版本的兼容性

R2016a支持两种语法选项,我注意到它们之间没有区别.但是,它们与R2015b中基于"@"的语法略有不同:

  1. 在R2015b中,继承自myProp的类的对象完美地通过"类限制"检查,然后"按原样"存储.因此,整个过程就像添加到属性集方法的显式检查一样MyPropClass2MyPropClass1isa(newPropVal,MyPropClass1)MyPropClass1

  2. 如果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)


Jon*_*nas 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
Run Code Online (Sandbox Code Playgroud)