【学習】ターン制バトルで学ぶオブジェクト指向(3)Warrior と Mage 〜重複に気づく〜
第2回では Warrior が GetPower() を持ちました。
ここで 魔導士(Mage) を追加してみます。魔法攻撃の強さは Magic で表し、攻撃力の計算式は戦士と 似た形 にしておきます。
今回の最小ゴール
WarriorとMageの 2クラス を並べて定義する- 両方とも 名前・HP・攻撃力計算メソッド を持つことを確認する
- 「構造がほぼ同じ」という 違和感 を言葉にできる
前回からの差分
- クラスが 2つ になる
MageはMagicを持ち、GetPower()の中身がMagicベースになる
ソリューションとプロジェクトを作る
- テンプレート: コンソール アプリ
- プロジェクト名:
TurnBattleOop03(任意)
Warrior クラス(第2回と同型)
public class Warrior
{
public string Name { get; set; }
public int Hp { get; set; }
public int Strength { get; set; }
public Warrior(string name, int hp, int strength)
{
Name = name;
Hp = hp;
Strength = strength;
}
public int GetPower()
{
return Strength + Strength / 2;
}
}Mage クラスを追加
public class Mage
{
public string Name { get; set; }
public int Hp { get; set; }
public int Magic { get; set; }
public Mage(string name, int hp, int magic)
{
Name = name;
Hp = hp;
Magic = magic;
}
public int GetPower()
{
return Magic + Magic / 2;
}
}Main で両方を表示
internal class Program
{
private static void Main(string[] args)
{
Warrior warrior = new Warrior("せんし", 100, 20);
Mage mage = new Mage("まどうし", 80, 25);
Console.WriteLine(warrior.Name + "の攻撃力:" + warrior.GetPower());
Console.WriteLine(mage.Name + "の攻撃力:" + mage.GetPower());
}
}ここで立ち止まる(授業の問い)
次の共通点に気づきませんか?
NameがあるHpがある- 攻撃に使う値を返す
GetPower()がある
つまり 「ほとんど同じ骨組み」 です。違うのは 力か魔法か と、その フィールド名と計算に使う値 くらいです。
この 重複 が、次回 親クラスにまとめる動機 になります。
WinForms / Unity での当たり所
| 状況 | 意味 |
|---|---|
| プレイヤーと敵でクラスが似る | 今回と同じで、共通化の候補 が見える |
| スキルが増える | メソッドが増え、整理の必要性が高まる |
重要ポイント
- 2クラス並べると重複が見える のが、設計を良くするチャンス
- いきなり
abstractを書く必要はない。コピーで増やして気づく のでもよい GetPower()という 同じ名前 が、あとで「同じ呼び方」につながる