開示:私は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
オブジェクトが消えたときに呼び出されるものを記述できます。これを行うExample new
と、名前を付けずにオブジェクトが作成されます。作成されたオブジェクトの名前は、それを呼び出した結果です。現在のオブジェクトの名前は、メソッド内で呼び出した結果ですself
。
コンストラクターとメソッドは、基本的な Tclproc
コマンドと同じように引数を取ることができます。デストラクタはできません。
より複雑
rename
他の Tcl コマンドと同じように、オブジェクトを d にinfo object
することができますinfo class
。を使用して、オブジェクトごとの特別な動作を任意のオブジェクトにアタッチできますoo::objdefine
。すべてのオブジェクトには、状態を格納するために使用できるプライベートな名前空間があります (x
上記の例の変数が存在する場所)。
名前が小文字で始まらない場合、デフォルトではメソッドはエクスポートされません (厳密には、glob パターン「<code>[az]*」と一致するかどうかによって異なります)。必要に応じて、これを変更できます。
クラスはそれ自体がオブジェクト ( のインスタンス) であるため、 ;oo::class
を呼び出して作成されます。それらのコンストラクターは、指定したスクリプトをコマンドに渡します。コマンドは、クラスの動作を定義する役割を果たします。およびメソッドはまさにそれです: それらのクラスのインスタンスを作成するクラスのメソッド (それぞれ名前付き/名前なし) 。oo::class create
oo::define
create
new
多重継承を使用できます。そしてミックスイン。そしてフィルター。また、ディスパッチ ハンドラを追加して、未知のメソッドを呼び出そうとする試みに対処します。
oo::class
オブジェクトを作成および管理する新しい方法を定義できるように、それ自体をサブクラス化できます。
oo::object
実行時に任意のオブジェクトのクラスを変更できます (およびを除くoo::class
。これらは、健全性のために特別にロックされています)。
…</p>
はい、私は TclOO の作成者ですが、自分の作成物で何ができるかをまだ調査中です。私は、あなたが要求することは事実上何でもできるように、非常に一生懸命に努力してきました。