|  | 
 
| 
$ e7 O) T) t) O0 p( ~
x
EDA365欢迎您登录!您需要 登录 才可以下载或查看,没有帐号?注册  在未公开的MATLAB类定义(classdef)特性(attributes),介绍了MATLAB一些未公开的特性,但是这可能还是远远不能满足我们的要求。比如说,有时我们需要强制限制某个属性的类型,以防止赋值的时候不必要的麻烦(这在C++/Java等语言是毋庸置疑的,因为C++/Java等语言是强定义类型)。比如有一个类,定了Width和Height两个属性,我们希望将这两个属性值定义为数值类型,防止用户不小心赋值为字符串或结构体。
 ; ^1 o9 [& a/ @, Q3 k( F  h8 x
 ' c( g9 A1 K; h, E在UDD类中,可以通过属性的DataType特性来轻松搞定这个问题,一个简易的做法,就是设置schema.prop函数的第二个参数。但是很不幸,在普通类中,并没有直接的公开解决方案。一个曲线救国的方案是重载属性的set方法(函数)
 1 @* [" l% u' {+ u$ W. a9 T! ]
 F. N7 q" B1 Uclassdef myclass   properties     ItIsAProperty = uint16(23); %# 指定默认值   end   methods   %# 重载set方法     function obj = set.ItIsAProperty(obj,val)        if ~isa(val,'uint16') % 判断类型是否正确          error('only uint16 values allowed')       end        %# 如果正确就赋值       obj.ItIsAProperty = val;     end   endend" D5 R+ s% g' v* l" K
 
 5 ]6 N+ E/ B1 b不过Amro提供了一个更加简洁方便的方案
 % T; p6 b9 ]. T8 F8 P1 E* ^6 Q+ E( G- m3 i" B% J3 L' J: v& L
 
 classdef Packet    properties       HeaderLength@uint16       PayloadLength@uint16 = uint16(0);       PacketType@char    endend2 u  A0 ?+ p2 b- S# u& U$ x
 2 b7 K" V$ G/ |( C3 U) X6 O5 u6 y: K
 Amro提示说,如果试图使用错误类型进行属性赋值,将返回错误) l/ G/ j7 v8 D4 J
 
 * l( D2 s$ e; U# n9 l0 N
 >> p = Packet;>> p.PacketType = 'tcp';  % ok>> p.HeaderLength = 100;  % not ok - should be a uint16While setting the 'HeaderLength' property of Packet:Value must be 'uint16'.5 {6 G1 v! m+ }* Q& \2 m2 f, |
 / A% Z; V) `5 W6 g. s+ s9 _$ z, Y: W6 ?4 \& {0 U. k( Y8 o; c7 b
 该语法格式支持所有的原始类型(char,inte32,double,struct,cell等),同时还支持任何自定义的类。
 % @0 S) I' M9 }$ D/ \0 C: x) E8 C/ V5 r
 在MATLAB R2013a的$matlabroot/toolbox/matlab/graphics/+graphics/+internal/+figfile/@FigFile/FigFile.m文件我们可以找到类似应用,不过在R2012a中测试结果表明也是有效的。
 j" y1 C1 d9 F( Q; L) w8 y$ i* y1 C3 [
 不过有点需要注意的,当使用上述方式设置属性值类型以后,将重载属性的所有set方法,也就是说属性自定义的set方法视乎失效了。) W3 D) S" Z$ l# U% q
 
 | 
 |