: オブジェクトベース言語のためのタイプ
: オブジェクトベース言語
: 動的継承とモードスイッチ
プロトタイプとクローンは、クラスとインスタンスに代わるものであった。
- いくつかのプロトタイプベース言語は、クラスに似た構造をベースとし
た、より伝統的なアプローチに向かった。
- Self と Cecil のような delegation ベース言語は traits
objects、 prototype objects、 normal objects を区別している
6
- Self と Cecil では traits と prototypes は共にクラスをエミュレー
トするために使われる。traits は、通常メソッドを持っている。prototypes
は通常 フィールドを持ち、親のための traits を持つ。
- normal オブジェクトは prototype からクローンされ prototypes の
traits を共有する(図4-4)。いくつかの traits は、多重継承の形において
単一 prototype により使われるかもしれない。
- クラスレス言語の精神により traits と prototypes はまだ通常のオ
ブジェクトである。しかし、それらは役割の分担がある。traits は normal
オブジェクトの親として共有される傾向がある。それらは直接使われること
なく、複製されるべきではない。
- プロトタイプは、クローンによりオブジェクト(プロトタイプ)の生成を
処理する傾向がある。それらは、直接アクセスまたは変更されるべきではない。
- normal オブジェクトは、単に局所的状態を格納するために使われる。
メソッドは traits に依存すべきである。
- traits と prototype の役割を区別することは、delegation context
において役に立つが、プロトタイプアプローチの精神を破壊するもので
ある[59]。
- traits は normal オブジェクトの intended attributes の一
部を含んでいる。一般に traits のメソッドは、プロトタイプに含まれる フィー
ルドを参照している。不完全な traits は、機能しない。これは(各オブジェ
クトは振る舞いに対して self-contained exemplar であるべきである)
original のプロトタイピングアイデアからはかけ離れている
7
- それゆえ traits は「全てはオブジェクトである」という世界でも
ordinary オブジェクトとしてみなすことは難しい。
traits は 型付き言語では normal オブジェクトとして使うことはできない。
また、それらのプロトタイプと共に特別に型づけされる必要がある。
- 結果として traits はクラスの性質の多くを含む。
- traits と他のオブジェクトを区別することにより、クラスベース言語
に逆戻りし、クラスとインスタンスを区別したようにみえるかもしれない。
事実 delegation ベース言語において traits とプロトタイプを区別するこ
とは、ちょうどクラスのための実現上の技術(implementation technique) の
ようである。Cecil と Omega は、動的継承をあきらめることによりクラスベー
ス言語に近づいている。
- このように、オブジェクトベース言語ではクラスベースの概念と技術は、
禁止されているわけではない。むしろ programming convention として、言語
構造の中に強いて再構築している。オブジェクトベースとクラスベースの間の空間は、
連続体として表現されるべきである[114]。オブジェクトベース言語の目標は
「クラスは共通の性質を持ったオブジェクトを生成する方法のうち(可能なも
のの)一つであることを明らかにすることである。オブジェクトはクラスより
primitive であり、クラスより先に理解され、説明されるべきである。
平成12年8月22日