全球FlexSim系统仿真中文论坛

标题: 声明正确类型变量的重要性 [打印本页]

作者: zorsite    时间: 2018-7-3 16:12
标题: 声明正确类型变量的重要性
如果想要使用某class的属性和方法,必须先将对象声明为该class类型的变量。
7 F; p7 x% ?3 K5 @& h3 h比如,某实体有一个表格标签,先将其声明为Table类型的变量,才可以使用表格的[]操作符引用单元格并赋值:
0 D/ ?, j0 }# T. N8 Y5 ATable LabelTable=current.labels["LabelTable"];
% z6 f7 @: v. ~+ ZLabelTable[1][1]=5;
) q  E0 w. T* n5 k( V' {0 Q
/ a$ ^7 A/ O# C" A如果直接对表格标签赋值会报错,比如以下语句:. `( l, N: J1 `. A
current.labels["LabelTable"][2][1]=3;( ^1 o, z5 X2 r2 K, o2 V# ~
+ b: R& m& J6 W! K7 B# @, y
再比如,将吸收器声明为Object类型的变量,则可以使用location属性:0 M- Y) v! p' H8 I+ X
Object Sink=model().last;
! S, o+ g% u# c0 i- uSink.location.x=0;7 r% p) Z' h" |7 ~! @
如果不声明直接引用则报错:. {8 T. o. |5 F* o
model().last.location.y=0;- |6 N, p  K; u" d
' P5 C7 P- H: E

- B5 i5 @8 c0 A- M: T4 I. C$ q如果将吸收器声明为treenode类型的变量,也无法使用location属性,因为treenode类并没有location属性,只有Object类才有location属性。
( K; H; j: a4 \% E* E1 Y比如:
2 i$ J" @/ _: V% |treenode sink=model().last;/ m8 s; S, y+ u3 |* \9 G
sink.location.x=0;
3 @  [9 Q( d* _+ m& `: o
& M! w9 G% Y8 x+ z6 Y$ ~, g这样的代码在语法检测时并不会报错,但是运行是就会抛出异常:
3 C/ [; }. Z+ n" X% j, |+ |5 D[attach]4445[/attach]8 Y! @% _  V! b) ]' f  h! [+ Y8 U
, b8 s  m4 j! a3 P6 Q3 F
明明是使用了错误的属性,为什么会报Label错误呢?
1 z7 A  u* P  U# u' J/ s0 EFlexsim并不认为location为属性,因为在treeenode类下没有该属性,只是建模者自己一厢情愿的认为其是属性。
/ X1 p( ~9 n$ @8 G% ~2 [( J对Flexsim来说,节点后面跟上点符号(.),引出的是属性、方法、标签。既然Flexsim没有检索到名为location的属性和方法,就会判定其是标签。但是我们并未在吸收器上设置名为location的标签,因此系统报错:标签不存在。! J+ `* \, X2 y) g. o
8 _( b1 s* d! J# _  z. n) u0 {

" l" f! h) W* e, }0 `# P3 `4 ^7 e
作者: zorsite    时间: 2018-7-3 16:17
Classes like the treenode, Object and Variant (to name a few) allow you to call methods,        as well as access properties, variables, attributes and labels (if applicable) using dot syntax.
1 ~& A8 z- r1 L0 y) O" T3 w
) a. m; {$ Z, e1 [( h# mtreenode、Object、Variant(等)类型的变量,可以使用点语法(dot sytax)调用方法,获取属性、变量、属性(特征)、标签(如果存在)。; U- |& v8 \5 y2 ^: P

作者: zorsite    时间: 2018-7-3 16:26
treenode和Object看上去很相似,在早期版本中没有Object对象,都是用treenode。
# W! H0 o3 U5 k" ?2 SObject继承自treenode,但是比treenode拥有更多的属性和方法。) b$ z1 P0 E2 E6 x
未在Object中列出、但treenode有的属性和方法,Object可以直接使用,但反过来不行。
; @$ W, Q3 w8 N/ I# j3 T2 J
作者: zorsite    时间: 2018-7-3 16:38
本帖最后由 zorsite 于 2018-7-3 16:40 编辑
* [: J9 X0 R+ l0 p- P8 n
3 E5 I; p, K9 I( H5 T8 ?[attach]4446[/attach]2 M9 w: L% L# I# s- a& g6 j/ S* i
0 ^7 Y# [% }$ o7 }( k
[attach]4448[/attach]
作者: 慧娴亚伦    时间: 2018-7-4 08:14
肉眼判断的方式:就是添加点语法命令的时候是否会自动变色,如果没有变色,也说明没有声明为Object或者根本就不存在该属性或方法
) F6 M! j! c& i. a但是在利用标签名使用点语法引用的时候,可能不会变色,但是也能正常使用。这是因为该标签是在运行过程中创建的,在执行该代码语句的时候,标签如果已经存在了,那么就可以正常使用。
. C0 \0 r: q) r& z" c4 a这也是为什么点语法在检查语法的时候对此类情况并不报错的原因。




欢迎光临 全球FlexSim系统仿真中文论坛 (http://www.flexsimasia.com/) Powered by Discuz! X3.3