コガネブログ

平日更新を目標にUnityやC#、Visual Studioなどのゲーム開発アレコレを書いていきます

【C#】デリゲートでオブジェクトの振る舞いを変える

// キャラクターの基底クラス
class Character
{
    public virtual void Start(){}
    public virtual void Update(){}
}

// 王国兵士
class Soldier : Character
{
    public override void Start(){}  // ここで王国兵士の初期化処理を設定
    public override void Update(){} // ここで王国兵士の更新処理を設定
}

// 魔法使い
class Sorcerer : Character
{
    public override void Start(){}  // ここで魔法使いの初期化処理を設定
    public override void Update(){} // ここで魔法使いの更新処理を設定
}

void Main()
{
    var soldier = new Soldier();
    soldier.Start();
    soldier.Update();

    var sorcerer = new Sorcerer();
    sorcerer.Start();
    sorcerer.Update();
}

今まではこのようの抽象クラスと派生クラスを使用して
オブジェクトごとに振る舞いを設定していましたが
仕様変更があった場合に対応に時間がかかるので

// キャラクターのクラス
class Character
{
    public Action Start;
    public Action Update;
}

void Main()
{
    // 王国兵士
    var soldier    = new Character();
    soldier.Start  = () => {}; // ここで王国兵士の初期化処理を設定
    soldier.Update = () => {}; // ここで王国兵士の更新処理を設定
    soldier.Start();
    soldier.Update();

    // 魔法使い
    var sorcerer    = new Character();
    sorcerer.Start  = () => {}; // ここで魔法使いの初期化処理を設定
    sorcerer.Update = () => {}; // ここで魔法使いの更新処理を設定
    sorcerer.Start();
    sorcerer.Update();
}

最近はデリゲートを使用してオブジェクトごとの振る舞いを設定するようにしています
前者のクラスベースの方は保守性が高く
後者のデリゲートベースの方は柔軟性が高いです
デリゲートベースであればクラスの数も抑えられるのも良いところです

これを関数指向と呼ぶのかどうかわからないですが…