Next: , Previous: , Up: The objects.fs model   [Contents][Index]


6.24.3.6 Class Binding

通常のセレクター呼び出し(selector invocation)では、 受信オブジェクト(receiving object)のクラスに応じて実行時(run-time)にメソッドが決定されます。 この実行時の選択(selection)は「遅延結び付け」(late binding)と呼ばれます。

場合によっては、 別のメソッドを呼び出すことが望ましい場合があります。 たとえば、 出力オブジェクト(printing objects)では、 受信用クラス(receiver class)の冗長になりがちな print メソッドの代わりに、 単純なメソッドを使用したい事があります。 これを実現するには、 print の呼び出しを以下のように置き換えます(コンパイル時の場合):

[bind] object print

または、 インタプリタ時は以下のようにします:

bind object print

あるいは、 メソッドを名前(例: print-object)で定義し、 その名前を使用して呼び出すこともできます。 クラス結び付け(Class binding)は、 同じ効果を達成する(多くの場合、 より便利な)方法にすぎません。 これにより、 名前の乱雑さが回避され、 最初に名前を付けずにメソッドを直接呼び出すことができます。

クラス結び付け(class binding)のよくある使用法は次のとおりです: セレクターのメソッドを定義するとき、 親クラスでセレクターが行っていることと、 それ以上のことをメソッドに実行させたいことがよくあります。 この目的には、 [parent] という特別なワードがあります。 [parent] "selector"[bind] "parent selector" と同等です。 ここで、parent は現在のクラスの親クラスです。 たとえば、メソッド定義は以下のようになります:

:noname
  dup [parent] foo \ 受信オブジェクトに対して親の foo を実行します
  ... \ (親の foo に加えて)更に何かする
; overrides foo

Object-oriented programming in ANS Forth (Forth Dimensions, March 1997) で Andrew McKewan は最適化手法としてクラス結び付け(class binding)を紹介しています。 著者は緊急の場合を除き、 最適化手法の目的で使用しないことをお勧めします。 とにかく、 このモデルでは遅延結び付け(Late binding)が非常に高速であるため、 クラス結び付け(class binding)を使用するメリットは小さいです。 適切でない場合にクラス結び付け(class binding)を使用すると、 保守性が低下します。

プログラミング・スタイルの質問については次のとおりです。 セレクターは受信オブジェクト(receiving object)の祖先クラス(ancestor classes)にのみ結び付け(bind)すべきです。 たとえば、 受信オブジェクトがクラス foo またはその子孫であることがわかっているとします。 その場合は、 foo とその祖先にのみ結び付け(bind)するべきです。