開示:私は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 createoo::definecreatenew
多重継承を使用できます。そしてミックスイン。そしてフィルター。また、ディスパッチ ハンドラを追加して、未知のメソッドを呼び出そうとする試みに対処します。
oo::classオブジェクトを作成および管理する新しい方法を定義できるように、それ自体をサブクラス化できます。
oo::object実行時に任意のオブジェクトのクラスを変更できます (およびを除くoo::class。これらは、健全性のために特別にロックされています)。
…</p>
はい、私は TclOO の作成者ですが、自分の作成物で何ができるかをまだ調査中です。私は、あなたが要求することは事実上何でもできるように、非常に一生懸命に努力してきました。