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 nothing
echo
方法实现。但是,真正的代码会注意到明显的差异;微基准标记在现实中很少有用。)

非常感谢。我希望它是简单的,非常有用,知道它实际上是;)对于阅读本文的人,我在某些地方使用了
innerABC
而不是
inner1
,以更清楚地说明什么名称与什么匹配。就这些…
$c echo1 "Hiya!"