Oop TclOO:访问嵌套对象
假设我们有两个类,如下所示:Oop TclOO:访问嵌套对象,oop,tcl,Oop,Tcl,假设我们有两个类,如下所示: oo::class create InsideThing { constructor {} { puts "Made a [self] that is an InsideThing" } destructor { puts "Deleted a [self] that is an InsideThing" } method echo {text} { puts "[self]:
oo::class create InsideThing {
constructor {} {
puts "Made a [self] that is an InsideThing"
}
destructor {
puts "Deleted a [self] that is an InsideThing"
}
method echo {text} {
puts "[self]: $text"
}
}
oo::class create Container {
constructor {} {
puts "Created a [self] that is a Container"
InsideThing create inner1
InsideThing create inner2
}
destructor {
puts "Deleted a [self] that is a Container"
}
method echo1 {text} {
# how to do something like this:
$inner1 echo $text
}
}
我将如何访问这些内部对象?我想做如下事情:
set c [Container new]
# (1) accessing inner1 indirectly
$c echo1 "Hallo World"
# (2) accessing inner1 dirctly
$c inner1 echo "Hallo World"
有办法吗?这种做法有意义吗
我想要实现的是一个嵌套的对象结构(本质上类似于树)。我希望能够通过调用节点上的方法(例如,parent、child)来导航此结构。同时,销毁根目录应该销毁所有子目录(这就是为什么我使用
create
在父名称空间中创建嵌套对象)要简单地使用包含的对象,只需使用其本地名称,您应该知道,因为您在构造函数中创建了它。它不需要保存在变量中;确保它是唯一的名称是非常简单的,因为它将位于唯一的名称空间(实例名称空间;对于这类事情,每个TclOO对象都有自己的私有名称空间),并且您可以完全控制它
使用转发方法最容易暴露内部对象。
TclOO提供了两种主要的用户可配置方法:“普通的”proc
——类似于使用method
声明的方法,以及使用forward
声明的转发方法(有点像interp别名)。您转发的内容是关于实例名称空间的,这非常有用!
特别是,您可以对转发到相关内部对象的容器类创建一个forward
方法。这样(内部内容
不变):
然后可以调用内部对象,如:
$c inner1 echo "Yo!"
或者,您可以使用中间正常方法,如下所示:
$c echo1 "Hiya!"
这取决于你。(在我的非正式测试中,转发版本的速度大约快了20%,修改后的代码版本使用了微不足道的do nothingecho
方法实现。但是,真正的代码会注意到明显的差异;微基准标记在现实中很少有用。)非常感谢。我希望它是简单的,非常有用,知道它实际上是;)对于阅读本文的人,我在某些地方使用了innerABC
而不是inner1
,以更清楚地说明什么名称与什么匹配。就这些…
$c echo1 "Hiya!"