Oop 我是否需要明确地销毁Tcl中第二个类的实例中的1个类的实例

Oop 我是否需要明确地销毁Tcl中第二个类的实例中的1个类的实例,oop,tcl,instance,destroy,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中的实例bee,还是应该明确销毁po::bee?谢谢。bee是在class1的实例的命名空间中创建的,当实例被销毁时,命名空间

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

oo::class create class1 {
   method bar {} {
      class2 create bee
      bee method1
   }
}
现在,假设我有以下代码:

class1 create po
po bar
po destroy

我是否也在销毁po中的实例bee,还是应该明确销毁po::bee?
谢谢。

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

因此,您不需要显式销毁它,但如果您处理其他名称空间中要删除的实例,可以将其设置为在析构函数中自动执行:

oo::define class1 destructor {bee destroy}
如果想要一个方法来创建在创建实例被销毁时未被销毁的实例,可以在另一个名称空间中为创建的实例命名,例如
::bee
,或者让该方法返回
class2 new
的结果,像
set-cee[po-bar]
那样调用它。新实例可以用作
$cee
方法参数

文件: ,
oo::class的
create
方法更喜欢解析它创建的对象相对于当前名称空间的名称(即,如果它们不是绝对名称)。这意味着,当您在另一个具有非限定名称的对象的方法中调用它时,它创建的对象将放在另一个对象中。(您可以通过检查
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
它打印出如下内容(名称空间名称将发生变化):

::oo::Obj19::in 你好,我是外星人 你好,来自内心
但是,通常最好更直接地调用内部对象的
destroy
方法,因为这样不会丢弃析构函数中发生的任何错误。(对于另一种销毁方案,当前的内部API无法安全地保留错误报告,原因有很多,特别是当发生更广泛的删除时,这也是一种删除路径。)

您是否尝试编写了一些测试代码?快速
放入
class2
的析构函数中,会立即告诉您。 ::oo::Obj19::in Hi from an Outer Hi from an Inner