: Embedding による継承と Delegation による継承
: オブジェクトベース言語
: クラスなしのオブジェクト
- 上でみたように手続きによりオブジェクトをする生成することができる。
しかし、オブジェクトをパラメータ化する際に、全ての可能な方法を予測する
ことは難しく実用的ではない。
- いわゆるプロトタイプベース言語では、オブジェクトを生成する
ために別のアプローチを採用している。
- あらかじめパラメータ付き (parameterizing) オブジェクトを定義する
代わりに、prototypical オブジェクトから stock objects を生成し、後で
stock object をカスタマイズする。
- プロトタイプベース言語では、最初具体的かつ関数的なインスタンスを
生成する。インスタンスのいくつかが後で、インスタンスのクラスの
canonical representatives (プロトタイプ) として解釈される。
- プロトタイプを instantiating する基本的メカニズムはクローンで
ある。クローンは、オブジェクトの shallow copy(浅いコピー) を生成する。
- クローンは new に似ている。
この処理は、クラスに対してでなくオブジェクトに対して行う。クローンされた
オブジェクトは「インスタンスとして」かつ「プロトタイプとして」振る舞う。
- プロトタイプとしてのオブジェクトは、それから(オブジェクトを)クロー
ンするという意味で「クラス」のように振る舞う。かつそれから(プロトタイプを)
クローンするという意味で「スーパークラス」としても振る舞う。しかし、クラス
と異なり、プロトタイプ自身の right に基づいているという意味で関数的オ
ブジェクトである
1。
- 以下のようにフィールドをカスタマイズすることができる。
- より一般的に、メソッドを修正することによりクローンの振る舞いをカ
スタマイズしたいと思うかもしれない。オブジェクトの振る舞いを動的に修正
することは、オブジェクトベース言語におけるユニークな性質である。
cellClone.get :=
method ():Integer is
if self.contents
then return
else return self.contents end;
end;
メソッド get を「負の数を返さないように」変更した。
- メソッド update は、簡単にかつ静的に型付け可能であるという
利点を持つ2。
- メソッド update をより詳しく説明するために、節 2.3 の例
を
修正する。
ObjectType ReCell is
var contents: Integer;
method get(): Integer;
method set(n: Integer);
method restore();
end;
object reCell: ReCell is
var contents: Integer:=0;
method get(): Integer is
return self .contents end
method set(n: Integer) is
let x= self .get();
self .restore:= method ()
is self .contents:=x end;
self .contents:=n;
end;
method restore() is
self .contents:=
end;
end;
set メソッドは restore メソッドを update している。
backup フィールドを設ける必要はなし。
平成12年8月22日