今回は多態性
ざっくりとらえるためのもの
人間がどんな車もすぐに運転できるのは、どの車もハンドルとブレーキ操作が大体同じだから。ロボットにやらせるなら、細かく教えないといけない。
ちなみに私は乗ったことのない車の操作はしたくないです。レンタカー(しかもプリウス)を初見ですぐに運転できてた先輩はすごすぎる。
書く
普通インスタンス化するときは
SuperHero h = new SuperHero();
のように同じ型の変数にインスタンスを入れる。
Character c = new SuperHero();
みなしてほしい型に入れる。
嘘はダメ
extendsやimplementsでis-aの関係になっているものに入れられる。
抽象クラスを型として使える
抽象クラスはインスタンス化できないけど、型としては使える。
Life lf = new Cat();
その他
入れた箱のメソッドしか呼べない
動きは中身のメソッド
あいまいな型に入っている中身を厳密な型に無理やり代入する
Character c =new Wizard();
Wizard w = (Wizard) c;
嘘だと爆発する
嘘かどうか事前に判定する。
if ( c instanceof SuperHero){ ////trueだったら
SuperHero h = (SuperHero) c;
}
メリット
似たようなメソッドに同じ処理をするときに楽。
様々な職業のキャラクター達をcharacterだとざっくりみなして、同じ配列に入れ、ループを回して同じ処理ができる。
コードの重複が減る
また同じRun()という指示を1行書いても、それぞれのキャラによって定義されたRun()をする。
呼び出される側は、自分に決められた動きをする。