2011-01-21 24 views
3

継承in incr Tclが期待どおりに機能しません。以下のコードを考えてみましょう。[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::functionBaseからDerived継承ものの、Derivedで継承されていません。

私は間違ったことをしていますか?incr Tclはそのように動作するように設計されていますか?ドキュメントを読む

+0

「失敗」を定義します。 –

答えて

3

私は、あなたは彼らがあるべきだと思うITCLクラスの仕事でprocsの方法だと思いません?

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

これを読んだことは、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 
+0

'[incr Tcl]'クラスを 'C++'クラスのように動作させることを目的としています。これは言語欠陥であると思われます。 – Vahagn

+0

@Vahagnそれは、C++がクラスを実装する本当の方法の1つだと思われるようです。他のオブジェクト指向言語では、C++とSmalltalkとを違うやり方で扱います。 – Jackson

1

あなたがBase::functionを定義したprocが(多かれ少なかれ)名前空間Baseで定期的にprocのです。 Itclを継承すると、メソッドを継承するだけで、procを継承することはできません。関連するノートでは、Baseのインスタンスからプロキシfunctionを呼び出すことはできません。通常の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