コガネブログ

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

【C#】基底クラスの関数呼び出しを省略

// シーンの基底クラス
abstract class SceneBase
{
    public virtual void Update()
    {
        // 共通処理
    }
}

// タイトルシーン
class TitleScene : SceneBase
{
    public override void Update()
    {
        base.Update(); // ここがメンドくさい
    }
}

// メインメニューシーン
class MainMenuScene : SceneBase
{
    public override void Update()
    {
        base.Update(); // ここがメンドくさい
    }
}

クラスを継承して関数をオーバーライドして
派生クラスから基底クラスの共通処理を呼び出すときは
「base.関数名」で呼び出すことができますが、
毎回派生クラスから基底クラスの関数を呼び出すのは手間なので

// シーンの基底クラス
abstract class SceneBase
{
    public void Update()
    {
        // 事前処理

        // 派生クラス独自の処理を呼び出し
        DoUpdate();

        // 事後処理
    }

    protected abstract void DoUpdate();
}

// タイトルシーン
class TitleScene : SceneBase
{
    protected override void DoUpdate()
    {
    }
}

// メインメニューシーン
class MainMenuScene : SceneBase
{
    protected override void DoUpdate()
    {
    }
}

僕はいつもこのような記述方法を行います
こうして基底クラスの抽象メソッドを
基底クラスで共通処理を書く用の関数(Update)と
派生クラスで独自処理を書く用の関数(DoUpdate)で分割することで
毎回派生クラスで「base.関数名」を書く必要がなくなります

また、事前処理と事後処理を書けるので汎用性は高いです