【C#】ポリモーフィズムのサンプル(Unityとの比較)

ポリモーフィズム(Polymorphism)は、オブジェクト指向プログラミング(OOP)の重要な概念の一つです。ポリモーフィズムは、同じインターフェースや基底クラスを共有する複数の派生クラスや実装クラスが、異なる方法で振る舞うことを可能にするプログラミングの手法です。ポリモーフィズムは、コードの再利用性、拡張性、保守性を向上させるのに役立ちます

サンプルのコード

コードは、C#でクラスの継承とポリモーフィズムを示しています。MobStatusクラスが基底クラスで、EnemyStatusクラスがそれを継承しています。それぞれのクラスは、nameフィールドを持ち、Startメソッドを持っています。EnemyStatusはStartメソッドをオーバーライドし、独自のメッセージを表示します。プログラムのMainメソッドでは、2つの敵のインスタンスを作成し、それぞれのStartメソッドを呼び出しています。この方法により、クラスの再利用性が向上し、特定のオブジェクトに異なる動作を提供することができます。

using System;

namespace InheritanceConsole
{
    public class Program
    {
        public static void Main(string[] args)
        {
            MobStatus enemy1 = new EnemyStatus("Enemy 1");
            MobStatus enemy2 = new EnemyStatus("Enemy 2");

            enemy1.Start();
            enemy2.Start();
        }
    }

    public class EnemyStatus : MobStatus
    {
        public EnemyStatus(string name) : base(name)
        {
        }

        public override void Start()
        {
            base.Start();
            Console.WriteLine($"{Name}のEnemyStatus Start");
        }
    }

    public class MobStatus
    {
        public string Name { get; }

        public MobStatus(string name)
        {
            Name = name;
        }

        public virtual void Start()
        {
            Console.WriteLine($"{Name}のMobStatus Start");
        }
    }
}

実行結果

Enemy 1のMobStatus Start
Enemy 1のEnemyStatus Start
Enemy 2のMobStatus Start
Enemy 2のEnemyStatus Start

MobStatusを継承した派生クラスのPlayerStatusクラスも追加

派生クラスを増やしました
ただ、型は規定クラスのMobStatusとしています
なので、EnemyStatusクラスと同様に扱えるのが特徴です

using System;

namespace InheritanceConsole
{
    public class Program
    {
        public static void Main(string[] args)
        {
            MobStatus player = new PlayerStatus("Player");
            MobStatus enemy1 = new EnemyStatus("Enemy 1");
            MobStatus enemy2 = new EnemyStatus("Enemy 2");

            // enemy1.Start();
            // enemy2.Start();
            // player.Start();

            List<MobStatus> statusList = new List<MobStatus>();
            statusList.Add(enemy1);
            statusList.Add(enemy2);
            statusList.Add(player);

            foreach (MobStatus status in statusList)
            {
                status.Start();
            }
        }
    }

    public class PlayerStatus : MobStatus
    {
        public PlayerStatus(string name) : base(name)
        {
        }

        public override void Start()
        {
            base.Start();
            Console.WriteLine($"{Name}のPlayerStatus Start");
        }
    }

    public class EnemyStatus : MobStatus
    {
        public EnemyStatus(string name) : base(name)
        {
        }

        public override void Start()
        {
            base.Start();
            Console.WriteLine($"{Name}のEnemyStatus Start");
        }
    }

    public class MobStatus
    {
        public string Name { get; }

        public MobStatus(string name)
        {
            Name = name;
        }

        public virtual void Start()
        {
            Console.WriteLine($"{Name}のMobStatus Start");
        }
    }
}

実行結果

Enemy 1のMobStatus Start
Enemy 1のEnemyStatus Start
Enemy 2のMobStatus Start
Enemy 2のEnemyStatus Start
PlayerのMobStatus Start
PlayerのPlayerStatus Start

基底クラスの型を引数にしたメソッドサンプル

このC#プログラムは、オブジェクト指向プログラミングの基本的なコンセプトであるクラスと継承を示しています。MobStatus クラスはモブ(キャラクター)の基本情報を表し、EnemyStatus クラスは敵キャラクターの情報を拡張します。これらのクラスを使用して、異なる敵キャラクターのインスタンスを作成し、それぞれの Start メソッドを呼び出します。ポリモーフィズムを活用して、SampleMethod メソッドは異なるタイプのモブを受け入れ、その名前を表示します。プログラムの目的は、クラスの継承とメソッドのオーバーライドを理解し、異なるオブジェクトの共通の動作を実現する方法を示すことです。

using System;

namespace InheritanceConsole
{
    public class Program
    {
        public static void Main(string[] args)
        {
            MobStatus enemy1 = new EnemyStatus("Enemy 1");
            MobStatus enemy2 = new EnemyStatus("Enemy 2");

            enemy1.Start();
            enemy2.Start();

            // サンプルメソッドの呼び出し
            SampleMethod(enemy1);
            SampleMethod(enemy2);
        }

        // MobStatus型の引数を持つサンプルメソッド
        public static void SampleMethod(MobStatus mob)
        {
            Console.WriteLine($"SampleMethod: {mob.Name}");
        }
    }

    public class EnemyStatus : MobStatus
    {
        public EnemyStatus(string name) : base(name)
        {
        }

        public override void Start()
        {
            base.Start();
            Console.WriteLine($"{Name}のEnemyStatus Start");
        }
    }

    public class MobStatus
    {
        public string Name { get; }

        public MobStatus(string name)
        {
            Name = name;
        }

        public virtual void Start()
        {
            Console.WriteLine($"{Name}のMobStatus Start");
        }
    }
}

実行結果

Enemy 1のMobStatus Start
Enemy 1のEnemyStatus Start
SampleMethod: Enemy 1
Enemy 2のMobStatus Start
Enemy 2のEnemyStatus Start
SampleMethod: Enemy 2