メッセージ転送
オブジェクトにメソッドが適用できない場合「no-applicable-method」が呼び出される。また、オブジェクにスロットが存在しない場合「slot-missing」が呼び出される。
(1)全てのメッセージを無視するNullオブジェクトを作る
(2)上記を拡張し、必要なメッセージだけを処理するイベントハンドラーを作る
(3)受け取ったメッセージをフィールドに委譲し一種の多重継承を実現する
(4)フィールドへの委譲を利用し、動的な継承を実現する
(5)全てのオブジェクトに対し使用可能なProxyオブジェクトを作る
(6)メッセージを遅延送信できる
(4)(5)(6)について補足する。
(4)は、スーパークラスにあたるオブジェクトを実行時に交換できるという事である。古いインタフェースの互換性維持などに使用できる。例えばlineToなど単純なPath命令しか備えていないPathクラスと、Pathクラスを使用するVectorImageクラスが存在したとする。ある改修に伴いVectorImageがPathクラスは、drawEllipseを要求するようになった。この時、互換性の面からPathクラスのコードは変更できず、PathクラスにdrawEllipseを追加できないとする。
この様な場合、Pathクラスを継承しdrawEllipseを登録したPathExtendを作成するか、Pathクラスへのメッセージを全て委譲し、更にdrawEllipseを登録したPathExtenderを作成する手がある。継承を使用した前者の場合、Pathクラスと同じInterfaceを持ったクラスの整合性を保つため大量のXxxExtendクラスを作成する事になってしまう。