Cooooding!!

Unity(C#)を使ったゲーム開発関連Tipsなど

Interfaceに抽象ではないメソッドを追加する【C#】

概要

C# Job Systemの勉強をしていたらインターフェースに抽象ではないメソッドを追加する面白いテクニックを見かけたので紹介します。

追加する方法

追加する方法は簡単で拡張メソッドを使うだけです。例えば以下のように実装します。

public interface IEnemySetting
{
    string name { get; }

    int level { get; }
}

public static class IEnemyExtensions
{
    public static void Print(this IEnemySetting enemy)
    {
        UnityEngine.Debug.LogFormat("{0} Lv{1}", enemy.name, enemy.level);
    }
}

これはインターフェースなのでstructに継承させることもできます。普通は継承できないabstract classを継承するようなことが可能になります。

public struct HogeSetting : IEnemySetting
{
    public string name => "Hoge";

    public int level => 12;
}

public class NewBehaviourScript : UnityEngine.MonoBehaviour
{
    void Start()
    {
        var hoge = new HogeSetting();
        hoge.Print();       // インターフェースの拡張メソッドが呼べている
    }
}

C#8からはインターフェースのデフォルト実装が入るらしいのでもっと簡単にもっと便利なことができそうですが、それまでの代替機能としてときどき使えそうな気がします。

環境

  • Unity 2019.1.9f1
  • VisualStudio 2019