忍者ブログ

からすまる日誌 java

実践2(2) 多態性(2)

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

実践2(2) 多態性(2)


android stadio
SDKがみつからない
→保留で!


多態性の続き

p508
wizard,Main509をつくる

--->Main512.java

public class Main512 {
 public static void main(String[] args) {
  Slime s = new Slime();
  Monster m = new Slime();

  s.run();
  m.run();
 }

}

--->Monster.java

public abstract class Monster {
 public void run() {
  System.out.println("モンスターは逃げ出した");
 }
}

--->Slime.java

public class Slime extends Monster{
 public void run() {//override
  System.out.println("スライムはぴょんぴょん逃げ出した");
 }
}


最初ばってんがMainのMonster m = new Slime();部分についたが、
①Monster.javaのabstractが抜けていた
②Slime.javaのextends Monsterが抜けていた
 


実行結果
スライムはぴょんぴょん逃げ出した
スライムはぴょんぴょん逃げ出した
 


箱の型:どのメソッドを呼べるか
中身の型:メソッドが呼ばれたらどう動くか

奥の手が「キャスト」
キャスト? 聞いたことあるな?
あまり手段としてはよろしくないらしい

--->Main517.java

public class Main517 {

 public static void main(String[] args) {

  Character c = new SuperHero();
  //Character c = new Wizard();

  if(c instanceof SuperHero) {//trueのときのみキャスト
   SuperHero sh=(SuperHero) c;//キャスト
   System.out.println("c is SuperHero ins.");
   sh.fly();
  }else {
   System.out.println("c is not SuperHero ins.");
  }
 }
}
 


多態性のメリット

スライム、ゴブリン、蝙蝠を配列Monsterにぶちこんでfor文でまとめて攻撃できる

ところでHeroにエラーが出るようになりますね。

エラーが出るHero.java--->

public class Hero extends Character{
 String name = "ミナト";
 int hp = 100;

 public void attack(Monster m){
  System.out.println(this.name + "の攻撃!");
  System.out.println("10ポイントのダメージをあたえた!");
  m.hp -= 5;
 }

 public void run() {
  System.out.println(this.name + "は逃げ出した!");
 }

 public final void slip(){  /* finalがついているslip()メソッドは子クラスでオーバーライド禁止 */
  this.hp -= 5;
  System.out.println(this.name + "は転んだ!");
  System.out.println("5のダメージ");
 }

 public int getHp() {
  return this.hp;
 }

 public void setHp(int hp) {
  this.hp = hp;
  System.out.println("Heroポイント" + hp);
 }
}
 

エラー2件ですね。
どう解決する??
ヒント:直すのはHeroではない

Character.javaのここを修正

public abstract void attack(Monster m);

Monster.javaの

int hp;
 


さて配列をfor文でぶん回して敵を一掃しますよ

--->Main523.java

public class Main523 {

 public static void main(String[] args) {
  Monster[] monsters = new Monster[3];
  monsters[0] = new Slime();
  monsters[1] = new Goblin();
  monsters[2] = new DeathBat();

  for(Monster m : monsters) {
   m.run();
  }
 }

}

--->出力結果

スライムはぴょんぴょん逃げ出した
ゴブリンはだだだと逃げ出した
蝙蝠は逃げ出した

これが「ゆるく定義」することのメリット。
呼び出す側はざっくりMonsterというくくりで呼び出し、
呼び出された側はそれぞれの種族による逃げ方で逃げるという動作をしている

PR

コメント

ブログ内検索

P R