3

incr Tclの継承が期待どおりに機能しません。以下のコードを検討してください。

package require Itcl

::itcl::class Base \
{
public {
    proc function { } { puts "==== Base::function" }
}
}

::itcl::class Derived { inherit Base }

Base::function
Derived::function    ;# FAILS

最後の行は失敗したため、Base::functionでは継承されませんがDerivedDerivedから継承されBaseます。

私は何か間違ったことをしていますか、それともincr Tclはそのように動作するように設計されていますか?

4

2 に答える 2

3

ドキュメントを読んで、 itcl クラスの procs があなたが思うように動作するとは思わない:

プロシージャ名?args? ?体?name というプロシージャを宣言します。proc は、クラス名前空間内の通常の手続きです。メソッドとは異なり、proc は特定のオブジェクトを参照せずに呼び出されます。proc 本体が実行されると、共通データ メンバーにのみ自動的にアクセスできます。args リストが指定されている場合は、このプロシージャの使用法に関する情報が確立されます。body コマンドを使用して proc 本体を再定義できますが、args リストはこの仕様に一致する必要があります。別のクラス メソッドまたは proc の本体内で、名前を使用するだけで、他のコマンドと同じように proc を呼び出すことができます。他の名前空間コンテキストでは、proc は「className::proc」のような修飾名を使用して呼び出されます。現在のクラスで再定義されている、または別の基本クラスによって隠されている基本クラスのプロシージャ。

これについての私の読みは、procはそのクラスに関連付けられており、派生クラスで参照できますが、定義されていないということです。たとえば、次のように動作します。

package require Itcl

::itcl::class Base {
    public {
        proc function { } { puts "==== Base::function" }
    }
}

::itcl::class Derived { 
inherit Base 
    public {

        proc function { } { 
            puts "==== Derived::function"
            return [Base::function] 
        }
    }
}

Base::function
Derived::function    ;# FAILS
于 2011-01-21T15:56:54.427 に答える
1

定義したprocBase::functionは、(多かれ少なかれ)名前空間内の通常のprocBaseです。Itclで継承する場合は、メソッドを継承するだけで、procは継承しません。関連する注記ではfunction、のインスタンスからprocを呼び出すことはできませんBase。通常のprocと同じように呼び出す必要があります。

itcl::class Base {
  public {
    proc function { } { puts "==== Base::function" }
  }
  public method test {} {
    $this function
  }
  public method test2 {} {
    function
  }
}

Base bb
bb test   ;# yields error: bad option "function"
bb test2  ;# works as expected
于 2011-01-21T17:51:03.970 に答える