多態性を使うことのメリット 多態性×配列
なぜ多態性を利用するのか?
例えば、5人のキャラ(違う職業)のHPを同時に回復したい時
多態性を使わないと、、、
1つの職業ずつ回復させないといけないので、
コードに重複が多くなり、記述が面倒
もし新たにコードを追加しないといけない場合(全部の職業にあるメソッドを追加したい時)
1つ1つのキャラにコードを追加していかないといけないので、
将来的にも多くの修正が必要
⇩
この面倒さを解決するには、
多態性と配列を組み合わせる
ザックリと5つの職業も1つのキャラと見なし、
その5つのキャラ(インスタンス)をparty配列にまとめ、
ループを回して一括でメソッドを実行させる(1行のコードで)
ex. public class Main{
public static void main(String args[ ]){
Character[ ] party=new Character( ); //Character[ ]という型の配列の箱を用意
↑配列の型 ↑配列変数名
party[0]=new Hero( ); //インスタンスをその箱に1つずつ入れていく
party[1]=new Thief( );
:
party[4]=new Wizard( );
//HPを全員回復させる
for(Character c: party){
// Character=要素の型, c=任意の変数名, party=配列変数名
// ループするたびにcに1人ずつpartyメンバーが入っていく
c.attack(50); //全職業のHPを50回復
}
・その他の多様性の活用法
〈クラス内でコードを短縮するために使う〉
public class Hero{
attack(Matango m){ //攻撃用メソッド
………
};
attack(Goblin g){
………
};
⇩
attack(Monster m){ //ザックリとMonster攻撃用にすれば1つの記述でOK
↑Monsterクラスを継承しているもの全てに適用される
☆ まとめ ~多態性で出来ること~
1.厳密には異なるインスタンスをザックリ捉えてまとめて扱う
ex 配列でまとめる、引数でまとめる
2.メソッドが動くかどうかの判断は入れた型(ザックリと捉えた方)で判断するが、
実際の動作は入れた中身(インスタンスそのもの)の記述で行う
ex. class Main{
public static void main(String args[ ]){
Monster[ ] monsters=new Monster[3]; //Monsterインスタンスを入れる箱を用意
monsters[0]=new Slime( );
monsters[1]=new Goblin( );
monsters[2]=new DeatBat( );
for(Monster m: monsters){
//Moster=配列の型、m=任意の変数名、monsters=配列名
m.run( ); //全てのMonsterにrun( );メソッドを実行させる
}
Main :呼び出す側
run( );という同じ指示(1度の記述でOK)
それぞれのClassのrun( )メソッド: 呼び出される側
Slime→身体をうねって走る
Goblin→腕をふって走る
DeatBat→羽ばたいて走る
⇩
それぞれ独自の動作で逃げ出す
〈多態性の最大のメリット〉
呼び出す側は相手を同一視し、1度の記述だけで呼び出せるのに、
呼び出される側はきちんと自分の決められた動きをしてくれるところ