学習記事一覧 · ターン制OOP入門

【学習】ターン制バトルで学ぶオブジェクト指向(3)Warrior と Mage 〜重複に気づく〜

第2回では WarriorGetPower() を持ちました。

ここで 魔導士(Mage) を追加してみます。魔法攻撃の強さは Magic で表し、攻撃力の計算式は戦士と 似た形 にしておきます。


今回の最小ゴール

  • WarriorMage2クラス を並べて定義する
  • 両方とも 名前・HP・攻撃力計算メソッド を持つことを確認する
  • 「構造がほぼ同じ」という 違和感 を言葉にできる

前回からの差分

  • クラスが 2つ になる
  • MageMagic を持ち、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() という 同じ名前 が、あとで「同じ呼び方」につながる

次に読む