我刚刚开始使用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坐标?
答案 0 :(得分:1)
在Itcl中(与Tcl的其余部分一样),您不传递对象本身,将使用命令解析的对象的名称传递给引用到对象。
一般来说,对象的名称应作为其完全限定名称传递,以便在Tcl中的所有名称都被理解为同一个名称。您可以使用N1
为namespace 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
}
我建议将公共变量的数量保持在最低限度,但这是您的业务。