はじめに
こんにちは(・ω・)ノ
今回は多態性について学びました!
第12章 多態性
1.多態性とは
多態性 ...オブジェクト指向プログラミングの3大機能の1つ
多態性のあいまいなイメージ
「あるものをあえてザックリ捉える」ことで様々なメリットを享受しようという機能
ザックリ捉えるメリット
日常でも...
救急車、タクシー、バスなどいろいろな車種があるがザックリいうと”車”である
車に限らず、人間は世の中にある複雑なものをザックリ捉えることで
厳密には違うものを「似たようなもの」としてうまく利用している
このような「現実世界でラクするためにザックリ捉える方法」をプログラムでも実現する機能
⇨多態性である
2.ザックリ捉える方法
多態性に専用の文法はない
⇨「代入の文法」を使うことでザックリ捉えることができる
例としてSuperHeroクラスを用いる
SuperHeroクラスには親としてHeroクラスさらにその親にCharacterクラスを持っている
通常SuperHeroのインスタンスを生成して利用する
SuperHero h = new SuperHero();
SuperHeroを「ザックリCharacterとして捉える」
Character c = new SuperHero();
このように左辺と右辺の型を変えることも可能
以後このcを利用すると本当はSuperHeroでもあくまでもCharacterとして捉えて利用する
多態性を活用するためには「箱の型」と「中身の型」という2つの型が関係してくる
インスタンスをどのように捉えるかはどの型の変数に代入するかで決まる
できる代入とできない代入
newするときに左辺と右辺は同じ型でなくてもいい
ただ許されない代入もある
わかりやすい判別方法...絵に書いてみて嘘にならないインスタンスの代入は許される
継承のもう1つの役割
絵に嘘が含まれるかの判断には「〜は〜の一種である」という前提知識が必要
人間には「犬が生き物の一種である」「剣は武器の一種である」ということを知っている
Javaには「何が何の一種であるか」ということを知らない
⇨継承によって「is-aの関係」をJavaに知らせるという役割も担っている
抽象クラスやインタフェースの型
抽象クラスやインタフェースからインスタンスを生み出すことはできないが、
それらの型を利用することは可能
3.ザックリ捉えたものに命令を送る
ザックリと捉えることで利用にどのような違いが生まれるか
⇨あいまいで抽象的なほど用途は限定され、具体的に捉えるほど用途は増える
あいまいな型の箱へのインスタンスの代入
インスタンスをあいまいに捉えることとなり、
「厳密には何型のインスタンスだったか」がわからなくなる
「箱の型」と「中身の型」
箱の型...どのメソッドを「呼べるか」を決定する
中身の型...メソッドが呼ばれたら「どう動くか」を決定する
4. 捉え方を変更する方法
ザックリと捉えることをした後に捉え方を変更する
⇨エラーになる
なぜか?
Character型の中身にはgirlやHeroなどがある場合
失敗する可能性があるとコンパイラが判断してエラーにする
キャスト演算子で強制的に変換できる
Character c = new Wizard();
Wizard w = (Wizard)c;
「あいまいな型に入っている中身を厳密な型に代入する」...ダウンキャスト
キャストの失敗時...ClassCastException
キャストによる強制代入の結果「嘘の構図」になったため強制停止せざるを得ないというエラー
インスタンスを代入可能かチェックする...instanceof演算子
安全にキャストできるかを判定する
変数 instanceof 型名
5.多態性のメリット
多態性の真価は次の2つを組み合わせたときに発揮される
1.ザックリ捉えてまとめて扱う
2.メソッドの動作は中身の型に従う
↑何ができるか
呼び出し側は相手を同一視し、同じように呼び出す
呼び出される側は、きちんと自分に決められた動きをする
同じ呼び出し方なのに、多数の異なる状態を生み出すことがあるという特性...多態性の由来
まとめ
is-aの関係ならインスタンスを親クラス型の変数に変えることができる
⇨まとめて扱うことができる
どのメソッドを利用できるかは箱の型(対象をどう捉えているか)で決まる
メソッドがどう動くかは、中身の型(対象が何であるか)で決まる
同一視して取り扱っても、個々のインスタンスは各クラスにおける定義に従い、異なる動作を行う
今回もありがとうございました!
ではまた〜 *˙︶˙*)ノ"