EDA365电子论坛网
标题:
设置MATLAB类(class)对象的属性(properties)类型
[打印本页]
作者:
thinkfunny
时间:
2020-2-11 13:42
标题:
设置MATLAB类(class)对象的属性(properties)类型
9 A! V* b( W* D# A7 d1 O" {
在未公开的MATLAB类定义(classdef)特性(attributes),介绍了MATLAB一些未公开的特性,但是这可能还是远远不能满足我们的要求。比如说,有时我们需要强制限制某个属性的类型,以防止赋值的时候不必要的麻烦(这在C++/Java等语言是毋庸置疑的,因为C++/Java等语言是强定义类型)。比如有一个类,定了Width和Height两个属性,我们希望将这两个属性值定义为数值类型,防止用户不小心赋值为字符串或结构体。
# W; F) _1 v. w1 r+ B+ h; [/ D
0 P$ A2 p" M( ^- \3 m4 D
在UDD类中,可以通过属性的DataType特性来轻松搞定这个问题,一个简易的做法,就是设置schema.prop函数的第二个参数。但是很不幸,在普通类中,并没有直接的公开解决方案。一个曲线救国的方案是重载属性的set方法(函数)
1 J4 q3 w8 E4 j
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
9 m* g; V, G) Z+ n; [# e
/ \7 \2 Z2 m# N. ~& l3 q
7 }( Y' s# ]+ j! n" o
不过Amro提供了一个更加简洁方便的方案
^+ r' G V$ [$ z3 f) H0 y
, \4 O8 l& `% U1 a" Z/ s2 f6 T
classdef Packet
properties
HeaderLength@uint16
PayloadLength@uint16 = uint16(0);
PacketType@char
end
end
7 t& b& _* Z6 Y/ `& ~, j, f
; k2 ? Y8 i0 Q
$ w: A: }+ s2 K7 a0 u- h
Amro提示说,如果试图使用错误类型进行属性赋值,将返回错误
! b; U' [! t, f
/ E" R' j5 P* M& ?& z
>> 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'.
9 p1 Y( }' |5 a! R
: @0 S! o# i1 D* H p) _
, i" Z7 }, h$ A
该语法格式支持所有的原始类型(char,inte32,double,struct,cell等),同时还支持任何自定义的类。
) i6 ~# Y) x% b8 ~ Y- I
2 H! m \/ w! l2 }; C; [3 d% @2 M
在MATLAB R2013a的$matlabroot/toolbox/matlab/graphics/+graphics/+internal/+figfile/@FigFile/FigFile.m文件我们可以找到类似应用,不过在R2012a中测试结果表明也是有效的。
% U2 i. I0 ?8 u5 E0 l b
# _6 z& I! P' x" Z
不过有点需要注意的,当使用上述方式设置属性值类型以后,将重载属性的所有set方法,也就是说属性自定义的set方法视乎失效了。
; R, T( c1 N# x) l! U% g
作者:
ExxNEN
时间:
2020-2-11 19:53
设置MATLAB类(class)对象的属性(properties)类型
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2