スッキリわかるJava入門 第３版を読んでみて- part11 -高度な継承

# はじめに
こんにちは(・ω・）ﾉ
今回はあいまいなクラスの定義について学びました！
## 第１１章　高度な継承
### 1.未来に備えるための継承
継承のツリーの上に行くほどあいまいで抽象的なクラスになる
⇨「あいまいなクラスたち」の定義方法を学ぶ
↓
高度な継承では理解のための意識の切り替えが必要
⇨高度な継承を使う時の「立場」がまったく違うことに注意

その立場とは...
立場１：目の前のプログラム開発に必要なクラスを作る開発者
　　　（既存クラスを継承し子クラスを作る）
立場２：未来に備え、別の開発者が将来利用するであろうクラスを準備しておく開発者
　　　（親クラスとなるクラスを作っておく）
　　　　　⇨立場１の人たちに安全・便利に使ってもらえる親クラスを作る

:sparkles: 「未来に備える開発者」の役割
他の開発者が効率よく安心して利用できる継承の材料を作ること

### 2.高度な継承に関する２つの不都合
不都合A
```
public class Character{
    String name;
    int hp;
    //逃げる
    public void run(){
        System.out.println(this.name + "は逃げ出した");
    }
    //戦う
    public void attack(Matango m){
        System.out.println(this.name + "の攻撃");
        m.hp -=??;//ダメージのポイントの数値をいくら入れるかわからない
    }
}
```

:zap: 不都合A
継承の材料となるクラスを作る時点では、
その処理内容をまだ確立できない詳細未定のメソッドが存在する

:sparkles: 現実世界に対応したメソッド定義の必要性
「現実世界の登場人物が持つ操作」であれば、クラスのメソッドも存在するべきである
（仮に、メソッドの処理内容は確定困難であっても）

##### 不都合Aに対する対応策と３つの心配事
対応：attackをからにしてオーバーライドしてもらう
心配１：オーバーライドを忘れる
心配２：「本当に何もしない」と区別がつかなくなる
心配３：意図せずnewして利用されてしまう

一部でも未完成部分が残っている設計図から、実体を生み出してはならない

:sparkles: そもそもnewされるべきではないクラス
Characterクラスのように詳細未定な部分が残っているクラスはインスタンス化されてはならない

心配３の原因
1.newによる利用：
　インスタンスを生み出すためにそのクラスを利用する
２.extendsによる利用：
　別のクラスを開発する際、ゼロから作ると効率が悪いのでそのクラスを継承元として利用する

:zap: 不都合B
クラスには２つの利用方法（newによる利用、継承による利用）があり、
開発者はそれを自由に選ぶことができる

### 3.抽象クラス
２つの問題と３つの不都合について解決していく
#### 詳細未定のメソッドを宣言
##### 心配１：
未来の開発者が、詳細未定のメソッドをオーバーライドし忘れる可能性がある

:sparkles: 心配１の解決
詳細未定なメソッドを抽象メソッドとして宣言すれば、
未来の開発者にオーバーライドを強制できる

それまで未定だったメソッドの内容を確定させること...__実装__

###### 心配２：
空のメソッドを作っておくと、「現時点で処理内容を確定できないメソッド」
なのか「何もしないメソッド」なのか、区別がつかない

:pencil2: 詳細未定のメソッド（抽象メソッド）を宣言
`public abstract 戻り値　メソッド名(引数リスト);`
abstract...「抽象的」「あいまい」という意味
abstractキーワードが付けられたメソッド...__抽象メソッド__

:sparkles: 心配２の解決
空メソッドは「何もしないメソッド」、
抽象メソッドは「現時点では何をするかを確定できないメソッド」として区別できる

##### 心配３：
未完成部分を含む継承専用のクラスを誤ってnewされる可能性がある

:pencil2: 抽象メソッドを含むクラスの宣言
```
public abstract class クラス名{
⋮
}
```
abstractが付いたクラス...抽象クラス

:warning: 抽象クラスの制約
　抽象クラスはnewによるインスタンス化が禁止される

:sparkles: 心配３の解決
継承専用のクラスは抽象クラスとして宣言すれば、間違ってnewされることはない

### 4.インタフェース
正しい継承ツリーを上へ辿ると...
１：抽象メソッドが増える
　「内容は確定できないが、一応存在する」という抽象メソッドが現れ始める
２：抽象メソッドやフィールドが減っていく
　クラスに定義してある抽象メソッドやフィールドが減っていく

条件を満たす「特に抽象度が高い抽象クラス」...__インタフェース__
:sparkles: インタフェースとして特別扱いできる２つの条件
1.すべてのメソッドは抽象メソッドである
2.基本的にフィールドを１つも持たない

:pencil2: インタフェースの宣言
```
public interface インタフェース名{
⋮
}
```

インタフェースを継承して子クラスを定義する場合... __implements__ を使用する

:pencil2: インタフェースの実装
```
public class クラス名　implements　インタフェース名{
⋮
}
```

:sparkles: インタフェースの効果
1.同じインタフェースをimplementsする複数の子クラスたちに、
共通のメソッド群を実装するよう強制できる
2.あるクラスがインタフェースを実装していれば、少なくともそのインタフェースが
定めたメソッドは持っていることが保証される

特別扱いされる理由
　「内部実装をいっさい定義しない」という性質があるから

:sparkles: クラスにはないインタフェースの特権
異なる実装が衝突する問題が発生しないため、
複数の親インタフェースによる多重継承が認められている

:pencil2: インタフェースによる多重継承
```
public class クラス名 implements
    親インタフェース名１, 親インタフェース名２,...{
 ⋮
}
```

インタフェースの継承
:sparkles: extendsとimplementsの両方を使ったクラス定義
```
public class クラス名 extends 親クラス
    implements 親クラス１,親クラス２,...{
⋮
}
```

## まとめ
高度な継承は未来に備え別の開発者が将来利用するであろうクラスを準備しておく開発者の立場で考えるとわかりやすい
高度な継承に関して、詳細未定のメソッドが存在する、クラスには２つの利用方法（newによる利用、継承による利用）があり開発者が自由に選択できてしまうという２つの不都合がある。
この２つの不都合に対する解決策は詳細未定のメソッドには実装と抽象メソッド、クラスの利用方法には継承専用のクラスは抽象クラスとして宣言すれば、間違ってnewされることはないという方法で対応できる

今回も読んで理解するのに時間がかかりました...
立場をしっかり念頭に置いて学んでいきたいです！
今回もありがとうございました！
ではまた〜　＊˙︶˙＊)ﾉ"