Tcl:添加实例的不同方式之间的区别class

Tcl: Difference between different ways of adding instance class

我找到了两种实例化方法class:

一个是:

class_name create instance
instance class_method

另一个是:

set instance [class_name new]
$instance class_method

每种方式都很好,那么这两种方式有什么区别吗?

我试过一些案例,

class 定义为:

oo::class create class_name {
    variable text
    method add {t} { set text $t }
    method print { } { puts $text }
}

第一种方式:

class_name create foo
foo add "abc"
foo print

class_name create foo

会return:

abc
Error: can't create object "foo": command already exists with that name

第二种方式:

set foo [class_name new]
$foo add "abc"
$foo print

set foo [class_name new]
$foo add "def"
$foo print

会return:

abc
def

这是我发现的一个不同点,貌似secnod方式更方便。

还望高手给个权威的答案或文档

唯一的区别是 classes 上的 new 方法会为您生成一个唯一的名称,并使用 create 方法指定名称。两者都提供了,因为它们每个都有用例。使用对您有意义的任何一个。 (请注意,class 对象本身总是根据它们通常的使用方式命名,因此您通常不能用 new 创建 classes;它隐藏在 oo::class 实例。)

仅出于完整性考虑,还有另一种创建实例的方法 createWithNamespace,它还允许您指定对象的状态命名空间的名称。默认情况下它不会公开(您必须手动 export 它才能用于一般用途)并且对于那些不进行深度恶作剧的人来说是非常专业的。您可能不想使用它。

在未来的某个时候,new 可能会得到增强,以便它还可以为对象启用垃圾收集,而 create 不会(因为您知道带外名称) .具体来说,我已经为 Tcl 9.0 编写了一个 TIP,但我还没有一个有效的实现,所以不要屏住呼吸。