: 動的継承とモードスイッチ
: オブジェクトベース言語
: Delegation
- embedding 継承においては、新たに生成されたホストオブジェクトは
donor attribute の複製を持っている。継承された donor attribute にアク
セスするためには、original の attribute にアクセスするのとなんら違いが
ない。
- delegation 継承(ホストオブジェクトは 外部の donor オブジェクト
へのリンクを持つ)では、状況はそんなに簡単ではない。メソッド呼び
出しの際の attribute lookup 手続きにより self が original の受側を
示すようにしなければならない。この要求は、実現と method lookup のフォー
マルモデリングの両方を複雑にする。
- クラスベース言語では embedding と delegation モデルは通常同じも
のである。オブジェクトベース言語では区別される。
- 一般に delegation での donor の性質の共有は、いくつかの
方法に分けることができる。
- delegation では donors は update されるかもしれないし、フィールドを含
んでいるかもしれない。変更は、inheriting ホストに見られる。
- 同じように、donor のメソッドは update されるかもしれない。
変更は inheriting ホストに見られる。
- donor へのリンクはしばしば、オブジェクトにある他のリンクへと置
換されるかもしれない。そのオブジェクトの全ての inheritors は、振る舞い
を変更されるかもしれない。
- クローンは、オブジェクトの shallow コピー(donor のコピーをしない)
を処理する。そして全てのクローンは donor、mutable フィールドと donor
のメソッドを共有するようになる。
- このように embedding と delegation は、プロトタイプを継承する際
に 2 つの根本的な方法の違いがある。両方の可能性を持つ興味深い言語があ
る。
- delegation は 2 つの内でもっとも知られた方法である。delegation
の利点は、オブジェクトの 全ての inheritors の予期しない変化を処理する
のに便利なことである。
- delegation を非難するとすれば(壊れやすいシステムになるような)依
存関係の 動的な web を生成することである。embedding はこの問題に影響を
与えない。なぜならオブジェクトは自立的であるからである。
- Kevo や Omega のような embeddingベース言語では、予期しない変化に
対しては(donor 階層なしのように)達成される。
- 共有による space 効率化は、delegation メカニズムの主な動機
の一つである。
- delegation ベース言語でさえ、透過に共有する構造を使ってクローン
演算を最適化している。同じ技術により embedding ベース言語の space
利用は最適化されうる。
- 結果として「オブジェクトベース言語での継承のための最良のモデ
ルは何か」の問いはまだ、オープンである。
平成12年8月22日