檜山正幸のキマイラ飼育記なんで多重継承はそんなに嫌われるのか? ちょっくら分析してみるかあたりからの着想
多重継承が~という話題は継承をインターフェースの継承だけにした上で、実装を委譲する機能を言語に持たせれば解決するかもしれない。
型の継承であればダイアモンド継承は問題にならない
Aを継承するB、B'があったとして、B,B'の二つを親とするCを考える。
継承関係がひし形になることからダイアモンド継承と呼ばれるが、この場合、BとB'は双方ともAで定義されたメソッドを持つし、
また、それぞれのメソッドの実装を持つかもしれない。
この場合、CはBとB'のどちらの実装を使うべきなのか?私が思うに、どちらの実装を使うか選べればいいのだと思う。
抽象メソッドのみから構成されるインターフェースのみの多重継承では実装の継承が行なわれないので
ダイアモンド継承はなんらの問題にはならない。
しかし、実装も継承したいのが人情というもの。いや、継承なんてしないで全部委譲にしちゃったら?
簡単に委譲できる構文があればよいのではないか?
Javaなどそうなのだけど、Adapterパターンとか、あるメソッドを他のオブジェクトのメソッドの呼び出しに中継するような
処理を書こうとした場合に非常に面倒臭い記述を強いられる。
public class Piyo {
private Hoge hoge;
public void hoge() {
this.hoge.hoge();
}
}
こんな感じで別のインスタンスのメソッドの呼び出しを中継するのだが、
これを該当の型に定義されているメソッド分だけ延々と記述する必要がある。
思うに、あるinterfaceで定義されたメソッドは全て同じinterfaceを実装したオブジェクトに委譲する、
といったことが簡単に記述できるようになっていて、複数のinterfaceをimplementsするクラスは
複数の実装オブジェクトに委譲できるようになっていればよいではないか?
別のオブジェクトに委譲する際にアスペクトをウィービングできるようならなお面白いと思う。
投稿日時 : 2008年3月21日 23:46