|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
- O% a2 E6 j9 k( ^8 Y+ l L, T
在未公开的MATLAB类定义(classdef)特性(attributes),介绍了MATLAB一些未公开的特性,但是这可能还是远远不能满足我们的要求。比如说,有时我们需要强制限制某个属性的类型,以防止赋值的时候不必要的麻烦(这在C++/Java等语言是毋庸置疑的,因为C++/Java等语言是强定义类型)。比如有一个类,定了Width和Height两个属性,我们希望将这两个属性值定义为数值类型,防止用户不小心赋值为字符串或结构体。' G5 f; g% a$ o2 Y7 w
# J! }3 H6 o: Y& Z1 I8 k1 S2 n+ S
在UDD类中,可以通过属性的DataType特性来轻松搞定这个问题,一个简易的做法,就是设置schema.prop函数的第二个参数。但是很不幸,在普通类中,并没有直接的公开解决方案。一个曲线救国的方案是重载属性的set方法(函数)' j6 t9 `2 g- M6 j5 B
- classdef 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
- end
- end" t; V% h9 ^+ |6 L* q! X$ ?& o8 |
, R d- a& v2 |1 o
& S, Y0 a* u j" M1 h0 c不过Amro提供了一个更加简洁方便的方案
) D" `) g+ L5 }: k& u, Y, ~0 Y0 f- |' Z* E7 s: u
- classdef Packet
- properties
- HeaderLength@uint16
- PayloadLength@uint16 = uint16(0);
- PacketType@char
- end
- end
2 I; }: h9 ^. s
* V: |" V# f8 W( m5 G0 |0 R! [0 c/ y% I$ u! Y' o
Amro提示说,如果试图使用错误类型进行属性赋值,将返回错误
2 w ]/ v- |8 F" s1 A: C+ z9 x( h# m+ e; e6 [
- >> p = Packet;
- >> p.PacketType = 'tcp'; % ok
- >> p.HeaderLength = 100; % not ok - should be a uint16
- While setting the 'HeaderLength' property of Packet:
- Value must be 'uint16'.( E' n$ u# T4 x! c8 H' V z
5 T& m# q/ a" V5 N* K( F3 {: t( Y# g5 `; C- V; j" \
该语法格式支持所有的原始类型(char,inte32,double,struct,cell等),同时还支持任何自定义的类。" S/ f! B5 d* K9 c' z' w8 k
$ w( Z" f+ a4 a; E0 J9 c$ V
在MATLAB R2013a的$matlabroot/toolbox/matlab/graphics/+graphics/+internal/+figfile/@FigFile/FigFile.m文件我们可以找到类似应用,不过在R2012a中测试结果表明也是有效的。8 j" @7 ]6 v( n3 z) V7 K) u5 x) Z
7 y9 x2 O1 r$ K' L+ j4 L* K2 V不过有点需要注意的,当使用上述方式设置属性值类型以后,将重载属性的所有set方法,也就是说属性自定义的set方法视乎失效了。
% k4 D8 e& B1 Y. q% j6 ?2 E, m |
|