説明する時にいつも読むのでまとめ
継承とは
共通点と相違点を体系的に分離して整理するもの
- クラスの共通部分を親クラスにまとめる仕組み
- 親クラスに共通の性質を定義し、子クラスに固有の性質を定義するもの
- コードの重複を排除して汎用性の高い部品をつくる仕組みの1つ
- オブジェクト指向三大要素の1つ
- 全体集合と部分集合の関係性を表す(集合論でいうスーパーセットとサブセット)
特徴
概念的側面(現実世界)
分類体系が説明できる
- 例えば「動物」と「人間」と「鳥」
- 「動物」(上位)の中の「鳥」
- 「人間」(下位)は「動物」の1つ
- 「鳥」は(下位)は「動物」の1つ
技術的側面(プログラミング)
継承を宣言するだけで親クラスの変数とメソッドを全て定義したことになる
- スーパークラスとサブクラスそれぞれのメソッドとして成立する
- 例えば「Animal」と「human」と「bird」
- 「動物」は「人間」も「鳥」も「食べる」けど、「人間は歩く」し、「鳥は飛ぶ」
- 「動物」は「人間」も「鳥」も「食べる」けど、「人間は飛ばない」し、「鳥は歩け、、る」(今回は歩けないとする)
- 共通の性質だけまとめて同じクラスに定義する
プログラミング技術における「抽象」を利用した場合
Animal.java
public abstract class Animal {
public void eat() {
System.out.println("ぱくぱく");
}
}
Human.java
public class Human extends Animal {
public void walk() {
System.out.println("てくてく");
}
}
Bird.java
public class Bird extends Animal {
public void fly() {
System.out.println("ばさばさ");
}
}
Main.java
public class Main {
public static void main(String[] args) {
Bird bird = new Bird();
bird.eat();
bird.fly();
Bird human = new human();
human.eat();
human.walk();
}
}
ポイント
- 子クラス内で継承を宣言(extends)しているので、子クラスをインスタンス生成(new)すると、子クラスにメソッドがなくても親クラスのメソッドが使える(eatメソッドが呼び出せる)
- 継承はポリモーフィズムを実現する機能の1つでもある
関連記事
書籍情報
平澤 章 (著) オブジェクト指向でなぜつくるのか 第2版
https://amzn.to/2VSrzwe
雑感
そういえば鳥は歩ける。たまに飛べない鳥もいる。
こういうのも現実世界に当てはめようとするとあれれとなるので、あくまで仕様的に問題ないということで。
今回「技術的側面」の部分で満たしたい「要件」は「親のメソッドを子生成後に呼べることの説明」なので「鳥」が歩かないことは仕様的に問題ない