高度な継承


abstractの考え方

例えば「人間」というクラス(食べる、歩く、寝る)から、「スポーツマン」・「読書家」というクラスを作る時、「スポーツマン」・「読書家」クラス毎に、継承元である人間クラスの(食べる、寝る)の量がそれぞれ違う。(スポーツマンは読書家よりたくさん食べ、読書家は夜更かしして、疲れてよく寝るスポーツマンより寝る量が少ないという事にして下さい 笑)
この場合、人間クラスでは(食べる、寝る)について詳細を定義出来ない。
しかし、人間は「スポーツマン」「読書家」に関わらず、必ず(食べる、歩く、寝る)という行為をする。
オブジェクト指向で考えれば、人間クラスで行う事は人間クラスに必ず記載しなければならない。
そのための機能。

曖昧なメソッドを定義する方法①

上記例でいう、(食べる、寝る) は、詳細が定義出来ないメソッドのため、メソッド作成時にabstractをつける事で、不完全なメソッドである事を定義出来る。

//メソッドの定義
アクセス修飾子 abstract 戻り値 メソッド名引数);

abstracrtでメソッドを宣言する事で曖昧なクラスのメソッドを定義し、以下の効果を得られる。

効果

・オーバーライドして、実装しないとエラーが発生するため、オーバーライドし忘れを防ぐ※曖昧なままインスタンス化されない
・定義出来ないのか、「何もしない」という定義なのか区別がつく

曖昧なクラスを定義する方法②

同じ様に上記の「人間」クラスの様に、曖昧なメソッドを持つクラスを定義する方法は、以下の通り。

//クラスの定義
アクセス修飾子 abstract class 戻り値 クラス名引数);

ルール

1つでも、曖昧なメソッドをもつクラスは必ずabstractをつける必要がある。

効果

・インスタンスとして生成出来ないため、誤ってインスタンス化されることを防ぐ

インターフェースについて

ルール

・全てのメソッドがabstractを使用した抽象メソッド

作成方法

アクセス修飾子 interface インターフェース名引数);

継承方法

アクセス修飾子 class クラス名 implements 親インターフェース名{
}

imprement = 実装するという意味

インターフェースを使用するメリット

インターフェースをimplementする事で、メソッドの実装が強制され、少なくともそのインターフェースを持っているメンバは保有する事が保証される。

特徴

・インターフェースのメソッドは自動的にpublic abstractが付く
・インターフェースのフィールドは必ずpublic static finalが付く
・多重継承が可能※詳細は下記に記載
 

多重継承について

 ーーーーーーーーーーーーーーーーー(困った例)ーーーーーーーーーーーーーーー
・人間クラス
「移動メソッド」歩いて移動

・悪魔クラス
「移動メソッド」飛んで移動
 
↓多重継承して、デビルマンを生成!

・デビルマンクラス

「移動メソッド」どっちを継承すれば・・・???
 
 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

 ーーーーーーーーーーーーー (インターフェースなら)ーーーーーーーーーーーーー
・人間インターフェース
「移動メソッド」未実装
・デビルインターフェース
「移動メソッド」未実装

↓多重継承して、デビルマンを生成!

・デビルマンクラス

「移動メソッド」実装:飛んで移動

 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

要するに、、、移動の様なメソッドはいろんなクラスが持つ可能性があるため、実装が衝突してしまう恐れがある。
しかし、インターフェースの場合、実装されていないため、メソッドが被っても子インターフェースで実装するため衝突しない。そのため、インターフェースは多重継承が可能。

多重継承の方法

アクセス修飾子 class クラス名 implements 親インターフェース名1,親インターフェース名2・・・{
}

extend implementsを同時に使う場合

アクセス修飾子 class クラス名 extends 親クラス名 implements 親インターフェース名1,親インターフェース名2・・・{
}

extend implementsの使い方まとめ

継承元             継承先         継承に使用するワード 継承元の数   
クラス クラス extend 1
インターフェース クラス implement 1つ以上
インターフェース インターフェース extend 1つ以上