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

时间:2011-08-25 14:23:50

标签: oop class matlab

我是使用MATLAB作为面向对象环境的新手,我正在写第一堂课来描述网络数据包。一个简单的例子如下

classdef Packet

    properties
        HeaderLength
        PayloadLength
        PacketType
    end

end

我想明确指出HeaderLengthPayloadLength都是uint16,PacketType是字符串。有没有办法做到这一点?

3 个答案:

答案 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中基于“@”的语法略有不同:

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

  2. 中的显式MyPropClass1检查一样
  3. 如果R2016a“将属性值限制为特定类”语法,Matlab会将所述对象转换为指定的类。这需要MyPropClass1的适当构造函数,这意味着MyPropClass1不能是Abstract

  4. 示例:

    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