TclOO:如何转发变量?

时间:2014-11-18 20:25:43

标签: oop tcl

我了解到我可以forward命令对象在构造函数中创建的对象。据我所知,这些对象作为实例名称空间中的命令存在。 但是,如果我要转发的对象从外部作为参数传递给构造函数而不是在构造函数内创建,我该怎么办? 将其存储为变量不起作用,因为forward仅适用于命令。我曾想过使用interp alias创建一个我可以转发的'本地'命令,但是我必须承认命令与变量的整个概念对我来说仍然有点麻烦(我更常用)到Python或C#)。

有关说明,请参阅以下示例:

oo::class A {
  method hello {} {
    puts "Hello, from [self]"
  }
}

oo::class B {
  constructor {some_a3} {
    A create a1
    A create a2

    # store some_a3
    variable a3
    set a3 $some_a3
    # this won't work because forward works on commands not variables
  }
  forward var1 a1
  forward var2 a2
  forward var3 ???
}

以便可以像这样使用:

set a3 [A new]
set b [B new $a3]
$b var1 hello
$b var2 hello
$b var3 hello
PS:我的方法应该完全偏离正常(非TCL之类),我愿意听取其他建议。 :)

1 个答案:

答案 0 :(得分:2)

不能直接转发给变量;转发机制非常简单。但是可以在构造函数中创建转发。这是通过oo::objdefine命令完成的,该命令对对象进行每个实例的更改,就像更改最具体的子类一样(除了它根本不是类;它实际上是实例)。 / p>

oo::class B {
    constructor {some_a3} {
        A create a1
        A create a2
        ##### The next line does the magic #####
        oo::objdefine [self]  forward var3  $some_a3
        # The double-spaces are for clarity only; they separate the part that belongs
        # to the call to the defining command, the forwarded method declaration, and
        # what it is being forwarded to. Two spaces is as good as one in Tcl command
        # invocations...
    }
    forward var1  a1
    forward var2  a2
}

在这种情况下,传入的对象不会被B的实例拥有;你必须手动删除它。此外,您可能希望确保命令名称是完全限定的。默认情况下,TclOO将对象作为完全限定名称返回,但大多数其他Tcl命令通常不合格(例如,几乎所有这些命令都在您的脚本和我的脚本中)。