このモデルでは、 受信オブジェクト(receiving objects)のクラスまたはその祖先の 1 つに定義されたセレクターのみを呼び出すことができます。 これらのクラスのいずれにも属さない受信オブジェクトを使用してセレクターを呼び出した場合、 結果は未定義になります。 あなたの運が良ければ、 プログラムは即座にクラッシュします。
ここで、 2 つのクラスで 1 つまたは複数のセレクターを使用できるようにしたい場合を考えてみましょう。
セレクターを共通の祖先クラスに追加する必要があり、 最悪の場合は object
に追加する必要があります。 たとえば、
他の誰かがこの祖先クラスに対して責任を負っているなどの理由で、 共通の祖先クラスへのセレクターの追加を実行したくない場合もあります。
この問題の解決策はインターフェイス(interface)です。 インターフェイスはセレクターのコレクション(collection)です。 クラスがインターフェイスを実装(implement)している場合、 そのインターフェイスのセレクターはそのクラスとその子孫のクラスで使用できるようになります。 クラスは無制限の数のインターフェイスを実装できます。 上で説明した問題については、 セレクター達の為にインターフェイスを定義し、 両方のクラスでそのインターフェイスを実装します。
例として、 オブジェクトをディスクに書き込んで戻すための storage
というインターフェイスと、 それを実装するクラス
foo
について考えてみましょう。 そのコードは以下のようになります:
interface selector write ( file object -- ) selector read1 ( file object -- ) end-interface storage bar class storage implementation ... overrides write ... overrides read1 ... end-class foo
(著者は、 ここから更に read1
を内部的に使用するワード read
( file – object )
を追加するのですが、 それはインターフェイスとは関係ないので、 ここでは説明を割愛します。 )
注意: インターフェイスでは protected
を使用できないことに注意してください。 もちろん、
フィールドを定義することもできません。
Neon モデルでは、 すべてのセレクターがすべてのクラスで使用できます。 したがってインターフェイスは必要ありません。 Neon モデルで支払う代償は、 遅延結び付け(late binding)が遅くなるため、 遅延結び付けを回避するために複雑さが増すことです。