4.4.1 多重継承(の是非)
- 多重継承(multiple inheritance):複数のクラスをスーパークラスとし、継承を行うこと
- 例:生物の進化の場合で「両親」という複数の親からの(遺伝)情報を受け継ぐ。(+突然変異→生物の進化と多様性が生まれる基礎である。
- 利点:複数の既存のクラスの組み合わせを行うことで(単純継承に場合と比較し)豊かな機能を持つクラスを設計できる(かもしれない)。
- 欠点:スーパークラスに選択された複数のクラスの中に 同じ名称の情報が含まれていた場合、どうなるのか? また、A,B,Cの3つのスーパークラスからの多重継承を行う場合、継承の組み合わせだけでも7種類のサブクラスが派生するから、これら多種類同士の多重継承を更に繰り返すと、二重にスーパークラスを継承することにもなり(菱形継承)、このための重複チェックが大変。
- 実際、Javaでは、クラスの多重継承を直接行うことはできない(extendsの後ろに2つ以上のスーパークラスを書けない)。
- 多重継承をサポートすると言語の構造が複雑になりすぎる、本当に多重継承を使わざるを得ない場合はそれほど多くない、などの理由による。
- Javaでは、多重継承ができない代わりに、インタフェースクラスをインプリメントすることができる。また、同時に複数のクラスをインプリメントできる。
4.4.2 インターフェース
- Javaにおける多重継承を説明するためには、 「インターフェイス(interface)」の概念を理解することが必要
- インターフェイス:以下の制限をつけられ、 「機能のみを完全に分離して記述された」特別なクラス。
インターフェイス内部に定義されるメソッドは全て abstractとして宣言され、 フィールドは全て static でなければならない」
- 注意点:
- インターフェイスの定義の始まりを表すキーワードは、 class ではなく interface である。
- インターフェイスの定義の中ではメソッドが abstractであることは自明なため、 abstractの修飾子を省略してかまわない
- 典型的なインターフェイスの定義は以下の通り。
public interface InterfaceA{ public void ProcessA(); } public interface InterfaceB{ public void ProcessB(); }
- インターフェイスもクラスの継承の機能を利用可能。 ただし、extends の後に 来るスーパークラスは、 当然のことながらインターフェイスでなければならない。
public interface SubInterfaceA1 extends InterfaceA { public void SubProcessA1(); }
- Javaのインターフェイスを通じた継承の具体例。
public class SubClassAB extends ClassA implements InterfaceA, InterfaceB ...{
- implements キーワードの後に継承すべきインターフェイスを指定すればよい。
- サブクラスがオブジェクトを生成できるクラスになるためには、 インターフェイスから受け継いだメソッドをすべて再定義して、その具体的な機能を用意する必要がある。これは「クラスへのインターフェイスの実装」と呼ばれる。
- extends でスーパークラスに指定されたクラスも、 implementsでスーパークラスに指定されたクラスも、 どちらもスーパークラスとして取り扱われる点では全く同等である。(ややこしいが理解せよ)
2003年10月21日 6:46 更新