Help us understand the problem. What is going on with this article?

高度な継承

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つ以上
k_sk193
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away