我是否需要明确地将一个类的实例存在于Tcl中的第二个类的实例中

时间:2017-03-15 13:52:25

标签: oop tcl instance destroy

让我们假设我有class1,由oo :: class create

创建
oo::class create class1 {
   method bar {} {
      class2 create bee
      bee method1
   }
}

现在,让我们说我有这段代码:

class1 create po
po bar
po destroy

我是否也在破坏po内的实例蜜蜂,或者我是否也应该明确销毁po :: bee?
谢谢。

2 个答案:

答案 0 :(得分:1)

bee是在class1实例的名称空间中创建的,当实例被销毁时,名称空间将被删除,bee也会被删除。

所以你不需要显式地销毁它,但是如果你处理你想要消失的其他命名空间中的实例,你可以将它设置为在析构函数中自动发生:

oo::define class1 destructor {bee destroy}

如果想要一个方法来创建在销毁创建实例时销毁的实例,则要么在另一个命名空间中为创建的实例指定名称,例如::bee,或者让方法返回class2 new的结果,将其称为set cee [po bar]。新实例可用作$cee 方法arg ...

文档: oo::defineoo::object

答案 1 :(得分:1)

create oo::class方法更倾向于解析它正在创建的对象的名称,而不是当前命名空间(即,如果它们不是绝对名称)。这意味着当您在具有非限定名称的另一个对象的方法内调用它时,它创建的对象将放在另一个对象中。 (您可以通过检查create方法的结果来验证这一点,oo::class create Inner { destructor { puts "Hi from an Inner" } } oo::class create Outer { method makeAnInner {} { puts [Inner create in] } destructor { puts "Hi from an Outer" } } Outer create out out makeAnInner out destroy 方法是普通类的创建对象的完全限定名称。)反过来,这意味着当外部对象被销毁时,内部对象当删除外部对象的实例名称空间并且其中的命令被终止时,也将销毁它。

让我们通过使用一些简单的类来演示:

destroy

打印出类似(命名空间名称变化)的内容:

::oo::Obj19::in
Hi from an Outer
Hi from an Inner

但是,通常更好地直接调用内部对象的*/15 * * * * /usr/bin/php /var/www/mose-base/bin/console beanstalk:worker:start --one-check 2>&1 | mail -s "mysql_dump" example@mail.example 方法,因为在析构函数中发生的任何错误都不会被丢弃。 (使用其他销毁方案,当前的内部API无法以各种丑陋的原因安全地保留错误报告,特别是因为这也是在发生更广泛的删除时使用的删除路由。)