Edited at

高度な継承

More than 1 year has passed since last update.


abstractの考え方

例えば「人間」というクラス(食べる、歩く、寝る)から、「スポーツマン」・「読書家」というクラスを作る時、「スポーツマン」・「読書家」クラス毎に、継承元である人間クラスの(食べる、寝る)の量がそれぞれ違う。(スポーツマンは読書家よりたくさん食べ、読書家は夜更かしして、疲れてよく寝るスポーツマンより寝る量が少ないという事にして下さい 笑)

この場合、人間クラスでは(食べる、寝る)について詳細を定義出来ない。

しかし、人間は「スポーツマン」「読書家」に関わらず、必ず(食べる、歩く、寝る)という行為をする。

オブジェクト指向で考えれば、人間クラスで行う事は人間クラスに必ず記載しなければならない。

そのための機能。


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

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

//メソッドの定義

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

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


効果

・オーバーライドして、実装しないとエラーが発生するため、オーバーライドし忘れを防ぐ※曖昧なままインスタンス化されない

・定義出来ないのか、「何もしない」という定義なのか区別がつく


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

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

//クラスの定義

アクセス修飾子 abstract class 戻り値 クラス名(引数);


ルール

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


効果

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


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


ルール

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


作成方法

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


継承方法

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

}

imprement = 実装するという意味


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

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


特徴

・インターフェースのメソッドは自動的にpublic abstractが付く

・インターフェースのフィールドは必ずpublic static finalが付く

・多重継承が可能※詳細は下記に記載

 


多重継承について

 ーーーーーーーーーーーーーーーーー(困った例)ーーーーーーーーーーーーーーー

・人間クラス

「移動メソッド」歩いて移動

・悪魔クラス

「移動メソッド」飛んで移動

 

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

・デビルマンクラス

hqdefault.jpg

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

 

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

 ーーーーーーーーーーーーー (インターフェースなら)ーーーーーーーーーーーーー

・人間インターフェース

「移動メソッド」未実装

・デビルインターフェース

「移動メソッド」未実装

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

・デビルマンクラス

story_img_1.jpg

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

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

要するに、、、移動の様なメソッドはいろんなクラスが持つ可能性があるため、実装が衝突してしまう恐れがある。

しかし、インターフェースの場合、実装されていないため、メソッドが被っても子インターフェースで実装するため衝突しない。そのため、インターフェースは多重継承が可能。


多重継承の方法

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

}


extend implementsを同時に使う場合

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

}


extend implementsの使い方まとめ

継承元            
継承先        
継承に使用するワード
継承元の数   

クラス
クラス
extend
1

インターフェース
クラス
implement
1つ以上

インターフェース
インターフェース
extend
1つ以上