全球FlexSim系统仿真中文论坛

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

作者: zorsite    时间: 2018-7-3 16:12
标题: 声明正确类型变量的重要性
如果想要使用某class的属性和方法,必须先将对象声明为该class类型的变量。$ L  b8 F# T1 z3 C  ?
比如,某实体有一个表格标签,先将其声明为Table类型的变量,才可以使用表格的[]操作符引用单元格并赋值:
" ?9 m4 y" m! g* N3 d. XTable LabelTable=current.labels["LabelTable"];
4 I0 j1 V4 I) \- J0 t; j1 j+ m! JLabelTable[1][1]=5;
: k: f0 H/ R) Q6 p3 Y. L3 @6 y; Q" b
如果直接对表格标签赋值会报错,比如以下语句:% L" P, ]' a# ^4 X; Y6 J
current.labels["LabelTable"][2][1]=3;
% W$ E2 ^) n& U/ q' d
# v3 r* r) z& G8 r4 V9 Q, b再比如,将吸收器声明为Object类型的变量,则可以使用location属性:
, h( A4 s  o# L6 c' X2 i/ eObject Sink=model().last;
( r' Q- N) t8 p5 }, {  `Sink.location.x=0;9 Q! L/ _/ X% e- f8 U; [2 J
如果不声明直接引用则报错:$ B) X' s; s, B. {$ D
model().last.location.y=0;
- s$ Z4 q5 A9 a0 h+ O& T
" A# \  w. @3 Q: N# z4 J- r5 G* p! G5 k, ]
如果将吸收器声明为treenode类型的变量,也无法使用location属性,因为treenode类并没有location属性,只有Object类才有location属性。& B0 _1 A6 d, C- p& }
比如:
2 c4 b0 ^0 v  ]/ G2 Btreenode sink=model().last;
; b+ a' w' |- n' }/ U1 jsink.location.x=0;  r$ _2 U+ B: }' c+ ^

. ?+ [. y0 h% M; n& i这样的代码在语法检测时并不会报错,但是运行是就会抛出异常:, V9 B5 A; l0 C, N/ Z+ z$ x
[attach]4445[/attach], q& h2 ^* i8 L) w3 H7 r8 I0 @
/ P7 ^* k& d& @$ Z( b
明明是使用了错误的属性,为什么会报Label错误呢?
7 y: z% K# R8 J. FFlexsim并不认为location为属性,因为在treeenode类下没有该属性,只是建模者自己一厢情愿的认为其是属性。
/ N7 d% X, s5 {, n4 `. }  ]$ J对Flexsim来说,节点后面跟上点符号(.),引出的是属性、方法、标签。既然Flexsim没有检索到名为location的属性和方法,就会判定其是标签。但是我们并未在吸收器上设置名为location的标签,因此系统报错:标签不存在。
5 V& l/ r$ n! X5 _0 Y/ c- A. p
, x) l7 B* w" s$ f. R6 ?6 B: U$ B) N0 x. R' W9 X

作者: 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.- U+ C# Y7 m6 u( M/ g' o- t' n% M

4 Q( m: e9 y' j& m0 f+ C9 mtreenode、Object、Variant(等)类型的变量,可以使用点语法(dot sytax)调用方法,获取属性、变量、属性(特征)、标签(如果存在)。
& W. e& k" y9 ~% b4 r- D5 g3 i0 I
作者: zorsite    时间: 2018-7-3 16:26
treenode和Object看上去很相似,在早期版本中没有Object对象,都是用treenode。( Z$ [+ k; @  L) \  q
Object继承自treenode,但是比treenode拥有更多的属性和方法。2 @3 y8 n, }0 ]
未在Object中列出、但treenode有的属性和方法,Object可以直接使用,但反过来不行。9 J# s) _/ `' W& Y; r# ]0 ^

作者: zorsite    时间: 2018-7-3 16:38
本帖最后由 zorsite 于 2018-7-3 16:40 编辑 0 G5 y& ]# b  N# X/ w8 a2 u+ b9 q

' ^% V' f) X/ t) e# r7 j, M[attach]4446[/attach]
6 [. M' c! C& J3 q% D( h: @" B3 X8 E' B/ u3 ?& G0 I
[attach]4448[/attach]
作者: 慧娴亚伦    时间: 2018-7-4 08:14
肉眼判断的方式:就是添加点语法命令的时候是否会自动变色,如果没有变色,也说明没有声明为Object或者根本就不存在该属性或方法
- o+ p* T6 I4 J( e3 K  Z! E% V  v但是在利用标签名使用点语法引用的时候,可能不会变色,但是也能正常使用。这是因为该标签是在运行过程中创建的,在执行该代码语句的时候,标签如果已经存在了,那么就可以正常使用。4 `8 U& h# C. d- g% f3 o8 ~
这也是为什么点语法在检查语法的时候对此类情况并不报错的原因。




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