全球FlexSim系统仿真中文论坛

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

作者: zorsite    时间: 2018-7-3 16:12
标题: 声明正确类型变量的重要性
如果想要使用某class的属性和方法,必须先将对象声明为该class类型的变量。
4 V: W- K) d" g1 j8 ^' z$ d8 k比如,某实体有一个表格标签,先将其声明为Table类型的变量,才可以使用表格的[]操作符引用单元格并赋值:4 O; _  e, K0 J( r
Table LabelTable=current.labels["LabelTable"];
2 T) X: z4 |6 O3 G$ t4 e" LLabelTable[1][1]=5;6 P" q! v2 Y6 |1 R, F$ u4 \1 T" A

  ~1 @+ Q9 G% G' A% ]7 s如果直接对表格标签赋值会报错,比如以下语句:* M2 r. U+ y' F' Q' w% E, d& B
current.labels["LabelTable"][2][1]=3;% _1 }5 _# |- q# p4 A6 ]& A) R! v' Q

8 Y/ P: z* W) f$ ^2 l+ n再比如,将吸收器声明为Object类型的变量,则可以使用location属性:
! d1 ?/ g9 J  \! j# z' mObject Sink=model().last;
% P- ~# X9 z1 N7 C8 m( x; qSink.location.x=0;) i0 r' V3 a+ q6 V! Z; ^
如果不声明直接引用则报错:, n2 w( s- j7 \0 X, m3 q8 g% c
model().last.location.y=0;
0 l# V/ j( O. }& m8 o/ }9 g/ I3 r
/ F6 C9 i/ Z, h4 n( q2 g7 y. C
如果将吸收器声明为treenode类型的变量,也无法使用location属性,因为treenode类并没有location属性,只有Object类才有location属性。
/ W; i' W6 \! f比如:# @- s) `# {6 B; |2 k! E
treenode sink=model().last;
+ u! P, x0 ^2 F. b. Jsink.location.x=0;/ x% K/ \/ e, ^
, w0 P$ N* w$ c- z+ p; ]/ P
这样的代码在语法检测时并不会报错,但是运行是就会抛出异常:2 Q& j  a: a. R& a$ z
[attach]4445[/attach]
; k- }0 {9 [* ]
% t' j( v. ]: x明明是使用了错误的属性,为什么会报Label错误呢?
" _$ Q  T+ ]8 P% sFlexsim并不认为location为属性,因为在treeenode类下没有该属性,只是建模者自己一厢情愿的认为其是属性。! c1 k2 P; s/ \
对Flexsim来说,节点后面跟上点符号(.),引出的是属性、方法、标签。既然Flexsim没有检索到名为location的属性和方法,就会判定其是标签。但是我们并未在吸收器上设置名为location的标签,因此系统报错:标签不存在。
# f' \  W0 p5 `8 }/ [
) O# Q  H$ r0 ~7 y9 V1 S& ^- B' y2 q% l

作者: 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.7 {- z8 }8 I( w/ X( r
& K6 q6 ~& Q  d% c8 U
treenode、Object、Variant(等)类型的变量,可以使用点语法(dot sytax)调用方法,获取属性、变量、属性(特征)、标签(如果存在)。# `& n) @) r7 N3 ^

作者: zorsite    时间: 2018-7-3 16:26
treenode和Object看上去很相似,在早期版本中没有Object对象,都是用treenode。0 G/ c* r6 ]+ {* b  Z# ?
Object继承自treenode,但是比treenode拥有更多的属性和方法。" _+ ]1 K8 X" ^# e6 o- f  G! L
未在Object中列出、但treenode有的属性和方法,Object可以直接使用,但反过来不行。- P9 N/ F3 b& S

作者: zorsite    时间: 2018-7-3 16:38
本帖最后由 zorsite 于 2018-7-3 16:40 编辑 ) F! V2 p' c2 v
4 \+ K. r  {; x  @% |
[attach]4446[/attach]! y+ Z+ ]2 s) M
" g0 o% r3 H' Y( C. o" e! j/ A7 i" g
[attach]4448[/attach]
作者: 慧娴亚伦    时间: 2018-7-4 08:14
肉眼判断的方式:就是添加点语法命令的时候是否会自动变色,如果没有变色,也说明没有声明为Object或者根本就不存在该属性或方法
0 m7 _; u+ f7 ^5 [: @7 V6 t但是在利用标签名使用点语法引用的时候,可能不会变色,但是也能正常使用。这是因为该标签是在运行过程中创建的,在执行该代码语句的时候,标签如果已经存在了,那么就可以正常使用。
% d& s3 s& z1 y+ E" G% S- }6 _这也是为什么点语法在检查语法的时候对此类情况并不报错的原因。




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