プログラミング応用a 第13回 『インタフェイス(interface )』 -01〜多重継承の問題点


【メソッドのインタフェイス部分と実装部分に関する再確認】
多重継承に関する問題を説明する前に,その理解のために,前回学習したメソッドのインタフェイス部分(シグネイチャ)と実装部分(ボディ)に関して再確認をしておくこと(下図:前回の図を再掲)。




【多重継承の問題点】
では,多重継承の問題点について紹介する。

下図は,クラスAとクラスB というふたつのクラスをスーパークラスとして,サブクラス C を定義しようとした例である。
ここで,問題が起こる。print( )というメソッドはスーパークラスAとBで同じシグネイチャを持つが,実装部分(ボディ部分)が異なる処理内容になっている。
サブクラスCでは,print( )のシグネイチャは共通のものなので1個のメソッドとして統合して継承するとして,実装部分(ボディ部分)はどっちから継承すればいいのかあいまいになってしまう

多重継承は,この様な複雑な問題点を持ち込んでしまうので, Javaでは多重継承を禁止しているのである。

しかし,Javaでは多重継承はできないものの,実質上,多重継承と同等のことができる。それを可能にするのが, interface という特別なクラスである。

多重継承の大きな問題点は,上図のようにスーパークラスから継承する実装部分が『衝突』してしまう(俗に「バッティングする」とかいいますよね)事が原因であった。

ならば,下図のように,実装部を一切持たない特別なクラスを考えてみよう。
つまり,メンバは実装部を持たないシグネイチャだけの抽象メソッドのみとするのである。


このように,原則として抽象メソッドしか含まない特別なクラスなら,それらを継承するサブクラスで実装部分が『衝突する』問題は起こらない

Javaでは,上図のクラスAやクラスBのように原則として抽象メソッドしか含まない(=純粋にインタフェイス部分からなる)特別なクラスを,
interface という擬似的なクラス
として定義できるようになっている。

そして,
 ・スーパークラスは, extends というキーワードを使って通常のクラス(具体クラス,抽象クラス)ひとつしか指定できない(単一継承,下図)。
としながらも, 
 ・ interface という疑似クラスは, implements (「実装する」という意味)というキーワードを使って,複数指定して継承することが出来る
  ようになっている(実質的な多重継承,下図②)



この interface という擬似的なクラスの定義の仕方について,次に紹介する。