文系seの備忘録

Excelの改行でひたすらスペースを打っていた機械音痴の文系seが日々の備忘録を綴る。

クラスは多重継承できないのに、インターフェースは何で複数継承ができるのか???

Java Silver紫本説いてて引っ掛かったところについて。


・インターフェースは、複数のインターフェースを継承することができる
・クラスは複数のクラスを継承(多重継承)できない



・・・混乱したorz

クラスは多重継承できないのに、インターフェースは何で複数継承ができるのか???

今回は調べる前に考えてみようと思う。
なので、今回の記事は完全に私の独断です・・java歴数ヶ月の素人が語っています、スミマセン



■ クラスを多重継承してみる

実際に、クラスを多重継承した場合を考えてみる。

Carクラス、Humanクラス、2つのクラスを用意。
そして、これをCarHumanクラスで継承させる。
f:id:ron623:20150225113628p:plain
人間クルマクラス・・・なんだかホラーです(挿絵入れてみました)
ここで、問題が出てきました。。


1.同名のメンバやメソッドが存在する場合
赤文字の「super.name」。
親クラスには両方ともnameという名前のメンバがあります。
なので、車の名前なのか、人の名前なのか、分からなくなってしまいます。


2.情報の混在
子クラスは車の情報と人の情報が混在しており、何をしたいのか
分からないクラスになってしまいました。
こちらはコンパイルできないとかいう問題ではありませんが、
そもそも、クラスは設計図であり、データとオブジェクトの雛形を定義したものです。

上記のようなクラス設計をすると
f:id:ron623:20150225114919p:plain
クルマ人間クラスというカオスなクラスとなってしまい、設計として
よろしくないんじゃないかと思います。



■ インターフェースで多重継承してみる

次に、インターフェースで多重継承してみます。
f:id:ron623:20150225121247p:plain

インターフェースに宣言した変数は、public static finalな定数となります。
なので、さきほどのクラス継承時に行った、メンバ変数へ値を設定する処理は出来ません。
f:id:ron623:20150225121302p:plain





■ 結論

で、これを踏まえて今回のお題である
「クラスは多重継承できないのに、インターフェースは何で複数継承ができるのか???」
の答えを導きだすと、

クラスの多重継承は、実装に関わる面で問題がある(同名のメンバやメソッドが存在する場合)と考えられます。




■ インターフェース多重継承の問題点

結論で締めようと思いましたが、問題点?っぽいものを発見。
それは、同名のメソッドが存在する場合の多重継承を呼びだす場合です。
インターフェースのメソッドはabstract public となり実装クラス側で実装する必要があります。

インターフェースを多重継承したインターフェースを作成し、それを呼び出してみます。

・インターフェース1

・インターフェース2

・1,2を継承したインターフェース

↑を呼び出す
f:id:ron623:20150225122924p:plain
エラー発生。内容にしたがい、「実装されていないメソッドの追加」をクリック。
普通ならここでエラーが消えるはず。しかし・・・
f:id:ron623:20150225123014p:plain
消えないorz

再度、、「実装されていないメソッドの追加」をクリック。
f:id:ron623:20150225123120p:plain
ダメでした。


同名メソッドでもインターフェース多重継承自体は問題なく行えるが、
呼び出し側でエラーが発生するという状態となりました。
これは、こういうものなんですかね・・・そもそも同名インターフェースを多重継承して実装する機会なんて無いんですかね???わけわからんです。


まぁ、クラスが多重継承できないことと、インターフェースは多重継承が出来ることまでは理解できました。

呼び出す際の問題点は今後の課題とします。