itcl如何将对象传递给其他对象

时间:2014-01-26 11:35:54

标签: tcl itcl

我刚刚开始使用itcl而我找到了How to pass itcl object from one class to another?,但这对我没有帮助。

我定义了以下对象:

package require Itcl

namespace eval FEM {

   itcl::class Node {
       variable nid
       variable x
       variable y
       variable z

       constructor {{NID 0} {coordX 0} {coordY 0} {coordZ 0}} {
         set nid $NID
         set x $coordX
         set y $coordY
         set z $coordZ
         return $this}

       method is {nid coordX coordY coordZ}
       method printString  
      }

   itcl::body Node::is {NID coordX coordY coordZ} {
       set nid $NID  
       set x $coordX
       set y $coordY
       set z $coordZ}       

   itcl::body Node::printString {} {
       return "$nid $x $y $z"}

# #######################################################

   itcl::class CQUAD {
       variable eid
       variable pid
       variable node1
       variable node2
       variable node3
       variable node4

       constructor {{EID 0} {PID 0} {NODE1 0} {NODE2 0} {NODE3 0} {NODE4 0}} {
         set eid $EID
         set pid $PID
         set node1 $NODE1
         set node2 $NODE2
         set node3 $NODE3
         set node4 $NODE4
         return $this}

       method is {EID PID NODE1 NODE2 NODE3 NODE4}
       method printString  

      }  

   itcl::body CQUAD::is { EID PID NODE1 NODE2 NODE3 NODE4 } {
       set eid $EID
       set pid $PID  
       set node1 $NODE1
       set node2 $NODE2
       set node3 $NODE3
       set node4 $NODE4}       

   itcl::body CQUAD::printString {} {
       return "$eid $pid $node1 $node2 $node3 $node4"}
  }

}

# ########################################################
# Test  

for {set n 1} {$n <= 4} {incr n} {  
   set coord1 [expr {$n+1} ]
   set coord2 [expr {$n+2} ]
   set coord3 [expr {$n+3} ]   
   set NID N$n
   ::FEM::Node $NID $n $coord1 $coord2 $coord3
   puts "[$NID printString]"
 }

set PID 99
set EID 88 

以下是错误的,因为$N1只是N1而不是“节点”N1

::FEM::CQUAD MyQuad $EID $PID $N1 $N2 $N3 $N4

但是如何将Node类型的对象传递给CQUAD类型的Object? 我也尝试过:

::FEM::CQUAD MyQuad $EID $PID $::FEM:Node::N1 $::FEM:Node::N2 $::FEM:Node::N3 $::FEM:Node::N4

另外,如何删除对象? unset $N1错误unset $::FEM::Node::N1也是错误的

最后一个问题:假设我有一个CQUAD对象,其中包含Node类型的对象: 我怎么能得到CQUAD 1的Node2的y坐标?

1 个答案:

答案 0 :(得分:1)

在Itcl中(与Tcl的其余部分一样),您不传递对象本身,将使用命令解析的对象的名称传递给引用到对象。

一般来说,对象的名称应作为其完全限定名称传递,以便在Tcl中的所有名称都被理解为同一个名称。您可以使用N1namespace which N1获取此内容。 (例外情况是Tk小部件名称,它们必须位于全局名称空间中,不合格地传递,并始终以.开头。)

要删除对象(而不是包含对象名称的变量),请使用:

itcl::delete object $theObjectName

请注意,Itcl对象是而不是垃圾收集(但是在简单的情况下可以使用合适堆栈帧中的变量的删除跟踪来模拟它; itcl::local命令使这更容易)。

要访问Itcl对象的 public 变量,请使用the cget method(如果您使用过Tk,则应该非常熟悉)。

set theYcoord [[$CQUAD cget -Node2] cget -y]

要使变量公开,您的类定义应该说,例如:

public variable y
public {
    # Both x and y are to be public variables
    variable x
    variable y
}

我建议将公共变量的数量保持在最低限度,但这是您的业务。