オブジェクト指向開発〜静的分析その5/多重継承

多重継承について。

多重継承

基底クラスを複数持つ継承を多重継承という。

goto文同様嫌われている

多重継承はCでgoto文が嫌われる様に、実装者視点で嫌われている。しかし、分析/設計の手法では明確に否定されている訳ではない。

多重継承の問題点

通常の継承が『拡張』であるのに対し、多重継承は『合成』。この拡張と合成の違いが、非常に重要な相違。多重継承では、同じ属性や操作が複数存在する事になる。

より深い分析

多重継承で同名の属性が複数存在する様な場合、それは分析が甘い場合が多い。類似した複数の基底クラスを考えると、それらが共通の概念でまとめられる可能性が高い。1つ上に抽象クラスとして共通概念を吸収する事で、この問題は解決される。

仮想基底クラス

C++では1つのクラスから2つに分かれた継承ツリーが、多重継承によって再び1つのクラスに合流するときに問題が起きる。多重継承する複数の基底クラスを1つの概念(クラス)にまとめたとしても、C++では多重継承する基底クラスそれぞれがその上の基底クラスを継承しているとみなし、結果として大本のクラスの属性を複数持つ事になってしまう。
これを解決するために、仮想基底クラスが用意されている。仮想基底クラスとして指定された基底クラスは、多重継承のときに重複するクラスになる場合にコンパイラが1つにまとめてくれる。 仮想基底クラスは菱形の継承のときにだけ使う事が妥当。

Mixin(ミキシン)

それ自体でインスタンスとして成立するクラスと違い、ある派生クラスの基底クラスになるためだけに開発する補助的なクラスを考える。これは他のクラスに意味を深し、拡張するためのクラスと言える。例えば、料理と調味料の関係がこれに当たる。

おまけ

「オブジェクト指向で最も重要な概念は、カプセル化/継承/多態性の3つである」は現在では当てはまらない。カプセル化の様なクラスの成り立ち自体を形成する概念は、「常識」として埋没していった。継承は重要な概念である事に違いは無いが、以前ほどに「オブジェクト指向と言えば継承」、「継承こそオブジェクト指向」といった風潮は無い。多態性は分析設計段階では明確に意識されず、実装上のテクニックとして認識されている。オブジェクト指向で特に重要なのは分析/設計であるという認識が定着して来ている現在では、多態性に特に注目が集まる事はほとんどない。

プロフィール

このブログ記事について

このページは、koshigoeが2005年12月14日 21:30に書いたブログ記事です。

ひとつ前のブログ記事は「Structured Bloggingっての」です。

次のブログ記事は「フィードリーダーの表現とか機能とか」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。