gpt4 book ai didi

tcl - 使用 TclOO 在对象创建中创建与新建

转载 作者:行者123 更新时间:2023-12-04 21:53:54 27 4
gpt4 key购买 nike

我正在研究 TclOO,发现我们可以使用 createnew 来创建对象。使用 create,我们可以提供自定义名称,而使用 new,它是计算机生成的。

#!/bin/bash
#\
exec tclsh8.6 $0 $@

::oo::class create calc {
method add { a b } {
return [ expr {$a+$b} ]
}
}

calc create c;
set t [ calc new ]

# Both serves the same purpose here
puts [ c add 3 4 ]
puts [ $t add 1 2 ]

是否仅仅是编译器为开发者提供的对象命名便利?另外,在什么情况下我应该更喜欢 new 而不是 create

最佳答案

newcreate 之间的唯一区别是 exactly create 允许您指定要使用的名称, new 为您制作了一个新的。某些类型的对象(特别是类)隐藏了它们的 new 方法,因此强烈建议您只创建命名实例——考虑到人们如何使用类,这在实践中很有意义——但这只是隐藏如果你愿意,你可以覆盖它:

oo::define oo::class {
export new
}

当您不关心名称而只是希望它与其他名称不同时,请使用 new。这是基本的经验法则。

单例

使用 create 来创建其他 OO 系统可能使用单例的实例也是完美的。有什么比给他们一个由您控制的好听的独特名称更独特的呢。

生命周期管理

我知道的主要场景是,当您想要将一个对象的生命周期绑定(bind)到另一个对象时,使用 create 更有用。在这种情况下,在另一个对象的上下文中创建对象会将对象句柄放入容器的命名空间中,并会在删除容器时自动触发删除:

oo::class create InsideThing {
constructor {} {
puts "Made a [self] that is an InsideThing"
}
destructor {
puts "Deleted a [self] that is an InsideThing"
}
}
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"
}
}

set c [Container new]
puts "Do stuff..."
$c destroy

如果您运行该代码,您会得到:

Created a ::oo::Obj13 that is a ContainerMade a ::oo::Obj13::inner1 that is an InsideThingMade a ::oo::Obj13::inner2 that is an InsideThingDo stuff...Deleted a ::oo::Obj13 that is a ContainerDeleted a ::oo::Obj13::inner1 that is an InsideThingDeleted a ::oo::Obj13::inner2 that is an InsideThing

此技术在 TDBC 中广泛使用,以在其容器(分别为语句和连接)的上下文中管理结果集和语句。

Tk super 微件

最后,如果您使用 TclOO 创建 Tk megawidgets,您将肯定使用 create 但是以覆盖的形式,因为 Tk widgets 必须具有以 . 开头的非限定名称,并且具有特定的体现层次结构,并且强烈建议 megawidgets 遵循相同的模式。因为名称在这种情况下很重要,new 是错误的方法;最好从 create 开始。 Tk 8.6 有一些支持类(未公开描述,但在内部用于某些对话框)使这类事情变得更容易:tk::Megawidgettk::MegawidgetClass。查看megawidget.tcl在 Tk 8.6 发行版中获取详细信息。

关于tcl - 使用 TclOO 在对象创建中创建与新建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26546961/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com