通常のセレクター呼び出し(selector invocation)では、 受信オブジェクト(receiving object)のクラスに応じて実行時(run-time)にメソッドが決定されます。 この実行時の選択(selection)は「遅延結び付け」(late binding)と呼ばれます。
場合によっては、 別のメソッドを呼び出すことが望ましい場合があります。 たとえば、 出力オブジェクト(print
ing
object
s)では、 受信用クラス(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)するべきです。