
今回は…
というテーマでお送りします。

今回も、楽しんで学びます。

今回も、よろしくお願いします。
【1】 ポリモフィズム

ポリモフィズム(多態性)とは…
オブジェクトが、異なる振る舞いをする部分を
同一のメソッド呼出しで 扱えることです。
同一のメソッド呼出しで 扱えること。
例えば、「日本人クラス」「アメリカ人クラス」
「中国人クラス」があるとして…
それぞれに…
というメソッドが、定義されています。

この場合、お国柄と言語に応じて…
日本人クラスは
ニッコリ笑って「こんにちは」と言う。
アメリカ人クラスは
手を振って「ハロー」と言う。
中国人クラスは
お辞儀をして「ニーハオ」と言う。
というように「挨拶」の振る舞いは異なりますね。

それぞれのクラスを実体化した、日本人オブジェクト
アメリカ人オブジェクト、中国人オブジェクトを 扱っていく時に…
こう考えます。
どれにも…
があるので、共通部分をまとめてしまいましょう。
…という事で「まとめ」の箱の登場です。

この「まとめ」には、状況によって…
日本人オブジェクトも、アメリカ人オブジェクトも、
中国人オブジェクトも入れられます。

そして、どれかが入っている場合
「まとめ」の中の「挨拶する()」を実行したい場合…
中に何が入っているかに関わらず

と表現すると、スッキリしそうですね。
そして、この…
を実行すると、「まとめ」の中身によって…
日本人オブジェクトなら
ニッコリ笑って「こんにちは」と言う。
アメリカ人オブジェクトなら
手を振って「ハロー」と言う。
中国人オブジェクトなら
お辞儀をして「ニーハオ」と言う。
…となりますので、振る舞いが異なります。

これが、ポリモフィズム…
オブジェクトが異なる振る舞いをする部分を
同一のメソッド呼出しで扱えること。
となるのです。
同一のメソッド呼出しで扱えること。

そして、質問です。どんなメリットがあるんですか?

そうですね。
このメリットを、まとめておきましょう。
1つめが…
(役割分担・効率)
❶「まとめ」のこの機能を呼び出す。
❷「まとめ」に入れるオブジェクトを作る。
ということです。
今回の例でいうと
挨拶する()というシグネチャを決めておけば…
呼び出し側は 各々のオブジェクトの詳細を
知らなくても、処理を書いていく事ができます。

そして、実際にオブジェクトの
元となるクラスを作る側は…
決まっているシグネチャに従って作ることに
専念できるようになりますね。

利点の2つ目は…
いけるということです。
今回の例でいうと、挨拶する() という処理を
定義する「●●人」というクラスを増やすことができて…

呼び出し側の処理には 影響を与えません。

ここは、拡張性が高まると言えますね。
(役割分担・効率)
❶「まとめ」のこの機能を呼び出す。
❷「まとめ」に入れるオブジェクトを作る。
✅ 「まとめ」に入れられる種類を
増やしていける。(拡張性)
…と、メリットを説明しましたが…
この部分は、プログラミングしていくうちに
段々と分かってくる事が多いものです。
今のところは、そういうものなのか…。
という感じの理解で、大丈夫です。

【2】 Javaでの実現方法


「まとめ」って、シックリこないんですよ…。

「まとめ」に入れて扱うという部分が
具体的にイメージできなくて…。

そして、この「まとめ」の部分を
Javaで実現する方法を見ていきましょう。
Javaでは、2つの方法があります。
(抽象クラス)
【2】 インタフェースを使う。
1つ目が、【1】 スーパークラスを使う 方法。
この中で、Javaの強力な機能で
を使う方法があります。
そして、もう1つが
【2】 インタフェースを使う という方法。
この2つです。
このうち、インタフェースについては 次回お話します。
今回は、スーパークラスで実現する方法と
抽象クラスについて…
次のコーナーから 見ていきましょう。
【3】 抽象クラス


「汎化」と「特化」のお話をした事を 覚えていますか?
汎化とは…
いつくかのオブジェクトの共通点を抽出して
定義すること、です。
定義すること。
Javaでの ポリモフィズム を 実現する方法のうち
スーパークラスを使うことは…
この「汎化」を行うことになるのです。

共通点を抽出して、スーパークラスを
定義することです。
先程の例で 考えてみましょう。
サブクラスが
アメリカ人クラス
中国人クラス
共通点を抽出するスーパークラスを ここでは…
としましょう。

この時に、共通部分が3つあったとします。
②歩く
③挨拶する
① 名前の部分は、属性に当たりますますので
フィールドで表現しましょう。
そして、②歩く は振る舞いですので
メソッドで表現できそうですね。
そして この歩くは、人間クラスで定義したメソッドを
サブクラスで、そのまま継承して使えそうです。

また、③挨拶するは
国によって振る舞いが 異なりましたね。
日本人クラスは
ニッコリ笑って「こんにちは」と言う。
アメリカ人クラスは
手を振って「ハロー」と言う。
中国人クラスは
お辞儀をして「ニーハオ」と言う。
この場合には 人間クラス(スーパークラス)で メソッドを
定義して サブクラスでは、
すると良さそうです。

また、サブクラスの参照(変数)は…
型変換して使う事(アップキャスト)

ができて、更に…
ダイナミックバインディングで、実行時のオブジェクト に
沿った メソッド が呼び出されます。

ですので、「まとめ」の実現は
このスーパークラスを使えばできそうですね。


ポリモフィズムの実現…。
余裕の よっちゃん。

今回の人間クラスで定義する、挨拶する() は…
して、振る舞いが 特定されるとしましょう。

そして、人間クラスがインスタンス化される事はなく
必ず サブクラスがインスタンス化の対象になると考えます。

と考えます。
この時に、人間クラス(スーパークラス)の
挨拶する() メソッドは必ずオーバーライドされるので…
だけを 定義しておく事になります。

このようなメソッドを
といいます。

そして、抽象メソッドを含むクラスを
といいます。

このように 抽象クラスを定義した場合、サブクラスの
いずれかが インスタンス化される事が 前提となるため…
抽象クラス自体は、インスタンス化できません。
抽象クラスは、サブクラスの雛形となるクラスです。
更に、抽象メソッドを定義するという事は…
サブクラスに 強制する
こととなります。

継承する時に、抽象メソッドの処理はサブクラスで
書いてくださいね。ということです。

サブクラスは 必ずオーバーライドする事になって…
そのメソッドが実体に沿った動きをしてくれるので…
利用する側は、呼び出し方を知っていれば
安心して 呼び出せるということですね。
【4】 Javaでの抽象クラス

Javaでの、抽象クラス・抽象メソッドの
書き方を見ていきましょう。
(フィールド記述)
:
public abstract 戻り値 メソッド名(型 引数,…);
:
(その他のメソッド)
}
抽象クラスは…
をつけて表現します。
それ以外の 記述方法は、通常のクラスと変わりません。

また この例のように、アクセス修飾子と共に
記述する場合が多いものですね。
記述の順番は
abstract public と書いても大丈夫ですが…
public abstract の順番が
Java の言語仕様で推奨されています。
また、抽象クラスの中には
抽象メソッドを 定義できます。
そして、この…
abstract修飾子をつけて表現
します。

を書くまでは通常のメソッド記述と同じですが…
メソッドの処理ブロックの {}(波括弧)は記述できません。
セミコロンで、ステートメントを終了する事となります。

また、この抽象クラスの「サブクラス」を
インスタンス化して利用する時に…
代入して扱うことができます。

抽象クラス自体は、インスタンス化できませんが
その「抽象クラス型」変数や配列を宣言して…
サブクラスの インスタンスの参照値を
アップキャスト して代入して 使用することができるのです。

この事で…
が実現できる事となります。

【5】 クラス図

クラス図での、抽象クラス・抽象メソッドの
表現方法を見ておきましょう。
抽象クラスは、クラス名を…
で記述します。

または…
つけて表現する方法
もあります。

このコースの中では、斜体で表現していきます。
また、抽象メソッドについても記述の方法は2つです。
1つの方法は…
表現する方法。

もう1つは…

こちらも このコースの中では、斜体で表現していきます。
この部分も、押さえておきましょう。
【まとめ】

同一のメソッド呼出しで扱えること。
① スーパークラスを使う。
(抽象クラス)
② インタフェースを使う。
(今回は、スーパークラスを使う方法
特に、抽象クラスを見てきました)
✅ 抽象メソッドはシグネチャを定義する。
(処理は サブクラスで実装する)
✅ 利用する側は、抽象クラスの型の
メソッド呼び出しを行うことで
ポリモフィズムが実現する。
abstract修飾子をつける。
✅ 抽象メソッドには
処理ブロック {} を記述できない。
クラス図では、斜体(イタリック)で
記述するか 後に {abstract} をつける。
今回も、ご覧いただき、ありがとうございます。