Tcl 8.4.18で単純なオブジェクト指向のシステムを実装しようとしています。私はItcl、stooops、XOTtclなどを見てきました。特に私が別の簡単なやり方をすることができれば、それらを使いたいかどうかは決めていません。とにかく、私は名前空間Tclインポートされたルーチンからインポータの名前空間を決定する方法
namespace eval Object {
namespace export setvar
proc setvar { model name value } {
set ${model}::${name} $value
}
}
、その後、私は「2を出力し、私はこの
Model::setvar Model foo 2
puts $Model::foo
のように変数を設定することができ
namespace eval Model {
namespace import ::Object::*
variable foo 0
}
別の名前空間であれば、「サブクラス」を持っていると言うことができます"しかし、Object名前空間のルーチン "setvar"が "Model"名前空間から呼び出されていると判断できるように、コードを単純化したいと思います。このような何か:
proc setvar { name value } {
set myspace [namespace current]
set ${namespace}::${name} $value
}
、その後は
Model::setvar foo 2
のようにそれを呼び出すが、それが原因で、[名前空間の現在]を返す「::オブジェクト」ではなく「::モデル」は動作しません。そのドキュメントによると、インポートによってObject名前空間への参照が戻されるだけなので、
ルーチンsetvarを使用する理由は、変数overrideが実装されていればModelからfooを使用できるようにすることです。それ以外の場合はObjectから取得します。
他にもこれを行う方法はありますか?それとも、私は他のツールの1つを使うべきですか?
おかげ
ああ、いつもの事、最初にあなたがTclの中に独自のOOシステムを書きます; - )。 Tcl 8.4.18のバージョンはかなり古いですが、新しいものはいくつか簡単にするかもしれません(特に8.6ベータにはOOシステムが組み込まれています)。私はあなたがしようとしていることは可能であると確信していますが、おそらく速くないでしょう。最も簡単な方法は、 'namespace import'をオーバーライドして、本当のインポートの代わりにエイリアスを作成させることです。または、名前空間コマンドリゾルバの使用がベストかもしれませんが、8.4では使用できません。 – schlenk
8.6のOOシステムは、8.5の拡張機能としても利用できます。 –
オブジェクトシステムは正しく動作するのが難しいことに注意してください。たくさんのことができますが、大量の作業をする準備ができていない限り、壁に当たってしまいます。 –