id:m-hiyama:20080109:1199863428 を SELF で


オブジェクトベースの OOPL である SELF にはクラスがないので、クラス-インスタンス関係はありません。すべて継承関係(正確には委譲関係)になります。移譲先は「ペアレントスロット」と呼ばれる特殊なスロットに関連づけしておき、自分が理解できないアクセスがあったときは移譲先に丸投げします。


http://squab.no-ip.com/collab/uploads/61/objectbase.png


オブジェクト生成器であるクラスがないので、オブジェクトは既存のオブジェクトの複製により生じさせます。図中のスクリプト

_AddSlots: (| p <- person copy name: 'tonkichi' |)

という式で、person というオブジェクトの複製により生じさせたオブジェクト(a person)を新しく設けたスロット p に関連づけしています。person がプロトタイプで、a person がクラスベースでいうところのインスタンスになります。インスタンスはプロトタイプの単なるコピーなので、ペアレントスロットは同じ移譲先を指します。


クラスベースなら移譲先は、そのインスタンスが属するクラス…ということになるのですが、クラスがない SELF では、トレイトと呼ばれるメソッドホルダ役の別のオブジェクトが代役を果たします(Squeak などのトレイトとは別物です。念のため)。a person の移譲先のトレイトは traits person です。traits person は、自身も別の移譲先を持っていて、ここでは traits clonable というトレイトを指定しています。このトレイトは自分に委譲してきたオブジェクトたちに #copy メソッドの使用を許します。a person を生じさせるときにプロトタイプである person(やはり移譲先は traits person)にコールさせた #copy メソッドはこの traits clonable から提供されたものだったわけです。


オブジェクトベースでは、オブジェクトは原則としてすべて「野良」なので、移譲先はあっても属するクラスというモノはなく、ましてクラスのクラスのクラス…などというメタメタな概念も必要とされません。善し悪しはともかく、とてもシンプルなのは確かです。