JAVA 多態性のメリット(P518)


■Main23.java

```java
public class Main23 {
	public static void main(String[] args) {
Hero2 hazardH1 = new Hero2();
		 Hero2 hazardH2 = new Hero2();
		 Thief hazardT1 = new Thief();
		 Wizard hazardW1 = new Wizard();
		 Wizard hazardW2 = new Wizard();
		 System.out.println("hazardW1の名前は" + hazardW1.getName() + "です");
		
		 // まず宿屋に泊まる
		 hazardH1.setHp(hazardH1.getHp() + 50);
		 hazardH2.setHp(hazardH2.getHp() + 50);
		 hazardT1.setHp(hazardT1.getHp() + 50);
		 hazardW1.setHp(hazardW1.getHp() + 50);
		 hazardW2.setHp(hazardW2.getHp() + 50);

	}
}
```
これを以下の様に多様性を用いてザックリ捉えることにより、5つのインスタンスをCharacter配列にまとめ、ループを回して一括で処理をすることが可能になる。

```java
public class Main23 {
	public static void main(String[] args) {
Hero2 hazardH1 = new Hero2();
		 // P520
		Character[] hazard = new Character[5];
		hazard[0] = new Hero2();
		hazard[1] = new Hero2();
		hazard[2] = new Thief();
		hazard[3] = new Wizard();
		hazard[4] = new Wizard();

		for (Character temporaryVariable : hazard) {
			temporaryVariable.setHp(temporaryVariable.getHp() + 50);
		}

		System.out.println(hazard[0].getHp());
		System.out.println(hazard[1].getHp());
		System.out.println(hazard[2].getHp());
		System.out.println(hazard[3].getHp());
		System.out.println(hazard[4].getHp());

	}
}
```

■実行結果
Hero2のコンストラクタが動作
Hero2のコンストラクタが動作
Hero2のコンストラクタが動作
Hero2のコンストラクタが動作
Hero2のコンストラクタが動作
Hero2のコンストラクタが動作
Hero2のコンストラクタが動作
150
150
50
50
50

■Character.java

```java

public abstract class Character {
	String name;
	int hp;

	public Character(String name, int hp) {
		this.name = name;
		this.hp = hp;
	}

	public Character(String name) {
		this.name = name;
	}

	Character() {
		this("冒険者");
		System.out.println("Hero2のコンストラクタが動作");
	}

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

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

	public void setHp(int hp) {
		this.hp = hp;
	}

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

	public abstract void attack(Matango2 m1);
	
}
```

■Hero2.java

```java
public class Hero2 extends Character {

	private String name;
	private int hp;
	static int money;
	// Sword2 sword;
	static int money2;

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

	public void setHp(int hp) {
		this.hp = hp;
	}

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		if (name == null) {
			throw new IllegalArgumentException("名前がnullである。処理を中断。");

		}
		if (name.length() <= 1) {
			throw new IllegalArgumentException("名前が短すぎる。処理を中断。");
		}
		if (name.length() >= 8) {
			throw new IllegalArgumentException("名前が長すぎる。処理を中断。");
		}
		this.name = name;
		System.out.println(this.name);
	}

	Hero2(String name) {
		this.hp = 100;
		this.name = name;
	}

	Hero2() {
		this("ダミー");
		System.out.println("Hero2のコンストラクタが動作");
	}

	void setRandomMoney() {
		Hero2.money = (int) (Math.random() * 1000);
		System.out.println(name + "たちの所持金を初期化しました");
	}

	//
	public void attack() {
		System.out.println(this.name + "は攻撃した！");
		System.out.println("敵に5ポイントのダメージを与えた！");
	}

	public void attack(Matango2 m) {

	}

	void sleep() {
		this.hp = 100;
		System.out.println(this.name + "は、眠って回復した！");

	}

	void sit(int sec) {
		this.hp += sec;
		System.out.println(this.name + "は、" + sec + "秒座った！");
		System.out.println("HPが" + sec + "ポイント回復した.");

	}

	private void die() {
		System.out.println(this.name + "は死んでしまった！");
		System.out.println("GAME OVERです。");
	}

	void slip() {
		this.hp -= 5;
		System.out.println(this.name + "は、転んだ！");
		System.out.println("5のダメージ！");

	}

	void run() {
		System.out.println(this.name + "は、逃げ出した！");
		System.out.println("GAMEOVER");
		System.out.println("最終HPは" + this.hp + "でした");

	}
}
```

■Wizard.java

```java
public class Wizard extends Character {
	int mp;

	public Wizard(String name, int hp) {
		super(name, hp);
	}

	Wizard() {
		super();
	}

	public void attack(Matango2 m) {
		System.out.println(this.name + "の攻撃!");
		System.out.println("敵に3ポイントのダメージ");
		m.hp -= 3;
	}

	public void fireball(Matango2 m) {
		System.out.println(this.name + "は火の玉を放った!");
		System.out.println("敵に20ポイントのダメージ");
		m.hp -= 20;
		this.mp -= 5;
	}

}
```