クラスは多重継承できないのに、インターフェースは何で複数継承ができるのか???
Java Silver紫本説いてて引っ掛かったところについて。
・インターフェースは、複数のインターフェースを継承することができる
・クラスは複数のクラスを継承(多重継承)できない
・・・混乱したorz
クラスは多重継承できないのに、インターフェースは何で複数継承ができるのか???
今回は調べる前に考えてみようと思う。
(なので、今回の記事は完全に私の独断です・・java歴数ヶ月の素人が語っています、スミマセン)
■ クラスを多重継承してみる
実際に、クラスを多重継承した場合を考えてみる。
Carクラス、Humanクラス、2つのクラスを用意。
そして、これをCarHumanクラスで継承させる。
人間クルマクラス・・・なんだかホラーです(挿絵入れてみました)
ここで、問題が出てきました。。
1.同名のメンバやメソッドが存在する場合
赤文字の「super.name」。
親クラスには両方ともnameという名前のメンバがあります。
なので、車の名前なのか、人の名前なのか、分からなくなってしまいます。
2.情報の混在
子クラスは車の情報と人の情報が混在しており、何をしたいのか
分からないクラスになってしまいました。
こちらはコンパイルできないとかいう問題ではありませんが、
そもそも、クラスは設計図であり、データとオブジェクトの雛形を定義したものです。
上記のようなクラス設計をすると
クルマ人間クラスというカオスなクラスとなってしまい、設計として
よろしくないんじゃないかと思います。
■ インターフェースで多重継承してみる
次に、インターフェースで多重継承してみます。
インターフェースに宣言した変数は、public static finalな定数となります。
なので、さきほどのクラス継承時に行った、メンバ変数へ値を設定する処理は出来ません。
■ 結論
で、これを踏まえて今回のお題である
「クラスは多重継承できないのに、インターフェースは何で複数継承ができるのか???」
の答えを導きだすと、
クラスの多重継承は、実装に関わる面で問題がある(同名のメンバやメソッドが存在する場合)と考えられます。
■ インターフェース多重継承の問題点
結論で締めようと思いましたが、問題点?っぽいものを発見。
それは、同名のメソッドが存在する場合の多重継承を呼びだす場合です。
インターフェースのメソッドはabstract public となり実装クラス側で実装する必要があります。
インターフェースを多重継承したインターフェースを作成し、それを呼び出してみます。
・インターフェース1
・インターフェース2
・1,2を継承したインターフェース
↑を呼び出す
エラー発生。内容にしたがい、「実装されていないメソッドの追加」をクリック。
普通ならここでエラーが消えるはず。しかし・・・
消えないorz
再度、、「実装されていないメソッドの追加」をクリック。
ダメでした。
同名メソッドでもインターフェース多重継承自体は問題なく行えるが、
呼び出し側でエラーが発生するという状態となりました。
これは、こういうものなんですかね・・・そもそも同名インターフェースを多重継承して実装する機会なんて無いんですかね???わけわからんです。
まぁ、クラスが多重継承できないことと、インターフェースは多重継承が出来ることまでは理解できました。
呼び出す際の問題点は今後の課題とします。