無責任の連鎖

プロトタイプベース・OOPL ではご先祖様を動的に変更できる、というのが普通だと思います。

《コード略》

ところで、自分自身のご先祖様に自分自身を指定するとどうなるのでしょう。たとえば javascriptisms はそのような状況は想定してないので、自分自身のご先祖様に自分自身を指定すると、メソッド委譲が輪になってしまい,いつまでたっても解決しません。

《コード略》

一昨日気付いたこの状態は "Chain of irresponsibility"(無責任の連鎖) と命名されました。その他のプロトタイプベース言語が今手元にないので、一般の言語でこのようなループに何らかの対策ができているのかはわかりません。

Io については、CoffeeDiary で Akiyah さんが試しておられるので、インスタンスベース*1の始祖的存在である SELF で試してみました。

globals _AddSlots: (| o <- (). p <- () |)
o slot   "=> Error: No 'slot' slot found in an object. "
p _AddSlots: (| slot = 3 |)
o _AddSlots: (| parent* = p |)
o slot   "=> 3 "
o _AddSlots: (| parent* = o |)
o slot   "=> Error: No 'slot' slot found in an object. "

…ということで、対処済みのようです。逆にここでループにならないことは、インスタンスベースをどのくらい真面目に考えて設計されているかの指標にもなりそうです。


*1:プロトタイプベースのこと。プロトタイプベースと呼ぶのにはいろいろと語弊がある(たとえば、オブジェクト生成手法と継承/委譲手法を混同して、インスタンスベースではクラス、あるいはそれに準ずる機構を使ってはいけない…かのように勘違いする人がいる)ので、最近はこの呼び名を使うようにしています。本当はオブジェクトベースと言いたいところなのですが、オブジェクト指向と混同する人がいるのでこちらは実際、使いにくいのです。