:
特色(Trait):プロトタイプからクラスへの逆戻り?
:
オブジェクトベース言語
:
Embedding vs. Delegation
動的継承とモードスイッチ
delegation 継承では、親へのリンクが固定される時、静的という。 また、親へのリンクは動的に update される時、動的という。
delegation ベース言語 Self では、例えば親へのリンクは変数として 宣言され、オブジェクトの親は動的に他のオブジェクトと置換することができ る(図4-3)
4
。動的 delegation は「動的継承」ともいわ れる。
動的継承は、一般的に危険な特徴であるが、むしろエレガントで 洗練 されたプログラミング技術である。
モードスイッチ (mode-switching)(親は、同じ attribute を持った別 のオブジェクトと置換される)は、動的継承の特別な場合である
5
。
モードスイッチの例として、アイコン化(モード)とオープン(モー ド)ウインドウを表現するオブジェクトを考えることができる。ウイン ドウキャンバスサイズとアイコン picture は、アイコン化と非アイコン化の 処理において保存される(同じである)。両モード共に、ウインドウは、描かれる picture を記録する。ウインドウは、モードに依存して異なった 反応をする。例えば、drawing primitive は on-screen と off-screen を切 り替え paint するかもしれない。
モードの切り替えは、親の切り替えにより処理することができる。 各親は、一つのモードの状態と振る舞いをカプセル化している。
一般に、同じ働きをするモードスイッチは、各メソッドのコードの中に フラグを挿 入することにより処理することができる。フラグを切り替えることにより、モー ドを切り替えることができる。しかし、この解はフラグとモードが複数となった 場合、扱いにくいものとなる。
さらに、フラグを使った解は、閉じた世界(全ての表現 や、将来追加されるであろうモード)を仮定することになる。ここでの親を切 り替える技術は、現存しているコードを変更することなく、新しいモードを追 加することができる。
delegation ベース言語において使われるモードスイッチは、動的に親 を変更する機能である。
モードスイッチの例として、節 4.5 のオブジェクト
の 新しい親
を与える。
reparent
reCellImp
to
cell';
これは
の親リンクを変更している(
を
に変更)。 これから
の呼び出しは
の
メソッドの代わりに
のそれを呼び出すことになる。
モードスイッチの影響と似たものは、メソッド update により達成する ことができる。例えば、節 4.4 の embedding モデルにおいて
の親 を
へ変更する。以下のように書くことができる。
reCellImp.get:=
method
(): Integer
is
return embed
cell'.get()
end;
reCellImp.set:=
method
(n:Integer)
is
self
.backup:=
self
.contents;
embed
cell'.set(n);
end;
このように embedding モデルでのメソッド update により (delegation ベースを含む) 動的継承のアプリケーションをエミュレートする能力をもつ。
平成12年8月22日