1

コンストラクター内のメソッドを使用してクラスを動的に拡張する可能性は Itcl にありますか?

動的に生成される関数がいくつかあります...

彼らはどういうわけかこのように見えます:

proc attributeFunction fname {
    set res "proc $fname args {
        #set a attribute list in the class  
    }"
    uplevel 1 $res
}

これで、可能な属性のリストを含むファイルができました。

attributeFunction ::func1
attributeFunction ::func2
attributeFunction ::func3 
...

このファイルはソースになります。しかし、今まではグローバル関数を追加していました。これらの関数をメソッドとして Itcl オブジェクトに追加する方がはるかに優れています。

少し背景情報:

これは、ユーザーがこれらの属性を他のキーワードなしで記述して簡単に追加できる抽象言語を生成するために使用されます。ここで関数を使用すると、見逃したくない多くの利点が得られます。

4

1 に答える 1

1

itcl::bodyItcl 3 では、(コマンドを使用して) 既存のメソッドを再定義することしかできません。コンストラクターで新しいメソッドを作成することはできません。

TclOO (完全に動的な OO コア) の基盤上に構築されているため、Itcl 4 でこれを行うことができます。これを行うには、基礎となる TclOO 機能が必要ですが、呼び出すコマンドは次のようなものです。

::oo::objdefine [self] method myMethodName {someargument} {
    puts "in the method we can do what we want..."
}

より完全な例を次に示します。

% package require itcl
4.0.2
% itcl::class Foo {
    constructor {} {
        ::oo::objdefine [self] method myMethodName {someargument} {
            puts "in the method we can do what we want..."
        }
    }
}
% Foo abc
abc
% abc myMethodName x
in the method we can do what we want...

私には合っているようです…</p>

于 2015-01-17T21:04:20.230 に答える