続々 プログラミング言語 Io : 多重継承

Io は、多重継承ができる。

プロタイプベース

前にも書いたように、Io は、クラスベースではなく、プロトタイプベースのオブジェクト指向言語

Vehicle := Object clone
Car := Vehicle clone
Civic := Car clone

と宣言していけば、

Vehicle <- Car <- Civic

というオブジェクトの階層ができる。

これとは別のオブジェクト階層として、

Maker := Object clone
Honda := Maker clone

と宣言して、

Maker <- Honda

というオブジェクトの階層を作る。

継承関係の表示

Io での継承関係は、protos メッセージ( プロトタイプを指す proto の 複数形 ) で確認できる。
スロット名の通り protos は、 list() 、つまり、複数のオブジェクトを保持できる。

Civic protos

は、今のところ

type = Car

だけ。

多重継承

Civic appendProto( Honda )

とメッセージを送ると、Civic のprotos 、つまり元になったオブジェクトの一覧に、 Honda を追加できる。

今度は、

Civic protos だと、

type = Car,
type = Honda

となって、めだたく(?)、Civic は、Car オブジェクトの特性と、Honda オブジェクトの特性を組み合わせて継承したオブジェクトになる。

Civic の生成時に多重継承を宣言しているのではなく、後から、他のオブジェクトの特性を注入(?)している。

Car にも、Honda に、それぞれ、次のようなスロットを追加する。

Car wheels := 4 (車輪は四つ)
Honda ism := "hondaism" (主張は、ホンダイズム)

この結果、

Civic wheels ==> 4
Civic ism ==> hondaism

というように、 Civic は、Car の特性と、Honda の特性を、多重に継承したオブジェクトになる。

触ってみて、はじめてわかる感触

Io は、単純さにこだわった言語なので、多重継承の仕組み、会話的に、ちょっと試してみるのは、とても便利。

第一印象は、継承というより、コンポジションに近い。

動的に継承関係を、append , remove できたり、継承関係を設定した後に、継承元にスロットを増やせば、それがそのまま反映されたりできるのが、そういう印象になっているのかもしれない。

個人的には、(単一継承のパラダイムでも)継承より、コンポジション派なので、多重継承も、正直いうと、懐疑的。

今まで、多重継承で、実際コードで、いろいろ試したことはなかったので、良い機会なので、ちょっと、多重継承ごっこ(?)をやってみようかと思っている。

たぶん、継承よりコンポジション、という自分のスタンスは変わらないだろうけど、多重継承というパラダイムを実際に触ってみることで、自分の設計感覚に新しい財産を追加できそうな期待感はある。

「多重継承」という言葉だけではぴんとこないけど、 Civic appendProto( Honda ) というコードを実際に書いてみると、全然違うものが見えてくるのが実感できる。