披露:我编写了 TclOO(在设计和测试方面得到了其他人的很多帮助)。
简单的开始
TclOO 允许非常简单的使用,但是当您开始使用它的大部分功能时会变得非常复杂。这是一个快速示例:
# Make a class
oo::class create Example {
variable x ;# Not the same as [variable] in a namespace!
constructor {} {
set x 1
}
method bar {} {
return [incr x]
}
}
Example create foo ;# Make an instance
puts [foo bar] ;# Call the instance to get 2
puts [foo bar] ;# Call the instance to get 3
puts [foo bar] ;# Call the instance to get 4
foo destroy ;# Kill the instance
编写一个类非常简单,上面的内容足以让你做很多事情。有一些基本功能没有列出:superclass
让你命名一个类的父类,它默认oo::object
是所有对象的类;forward
让您将方法调用分派给另一个命令,一种简单的委托;destructor
让您编写在对象消失时调用的内容;doingExample new
会在不命名的情况下创建一个对象,创建的对象的名称是调用它的结果;当前对象的名称是在self
方法内部调用的结果。
构造函数和方法可以像基本的 Tclproc
命令一样接受参数。析构函数不能。
更复杂
对象可以是rename
d ,就像任何其他 Tcl 命令一样,并且在info object
和info class
. 您可以使用oo::objdefine
. 每个对象都有一个私有命名空间,您可以使用它来存储状态(x
上面示例中的变量所在的位置)。
如果方法的名称不是以小写字母开头(严格来说,这取决于它是否匹配 glob 模式“<code>[az]*”),则默认情况下不会导出方法。如果您愿意,可以更改此设置。
类本身就是对象(的实例oo::class
),这就是为什么它们是通过调用创建的oo::class create
;它们的构造函数将您提供的脚本传递给命令oo::define
,该命令负责定义类的行为。create
和new
方法就是这样:创建这些类实例的类上的方法(分别命名/未命名)。
您可以使用多重继承。和混合。和过滤器。并添加一个调度处理程序来处理调用未知方法的尝试。
您可以oo::class
对自身进行子类化,以定义制作和管理对象的新方法。
您可以在运行时更改任何对象的类(除了oo::object
and oo::class
;出于理智的原因,它们被特别锁定)。
…</p>
是的,我是 TclOO 的作者,但我仍在探索我的创作能做什么。我已经非常努力地确保它几乎可以满足您的任何要求。