インタフェース(C#8.0以降の追加文法)

基本文法
C#8.0からインタフェースに大幅な機能追加が行われました
C#8.0以前のインタフェースはシグネチャだけを集めた純粋仮想関数みたいなものでしたが、
C#8.0以降のインタフェースはインスタンスフィールドを持てない抽象クラスのような感じです。

※インタフェースはフィールドを定義できないが多重継承できる
※抽象クラスはフィールドが定義できるが多重継承できない

以下のようなものが定義できるようになりました。
・定数
・演算子
・静的コンストラクタ・静的メソッド・静的プロパティ・静的インデクサ・静的イベント
・インスタンスメソッドの既定の動作
・アクセス修飾子
    interface ISample
    {
        // 定数
        const int START_INDEX = 10;
        // 静的コンストラクタ
        static int _sequence;
        // 静的プロパティ
        static int Sequence { get => ++_sequence; } 
        // 静的コンストラクタ
        static ISample() => _sequence = START_INDEX;

        // インスタンスコンストラクタは不可
        //ISample(){}

        // インスタンスフィールドもダメ
        //private int _field;

        // プロパティ
        int A { get; set; }
        int B { get; set; }

        // デフォルト実装
        void Output() => Console.WriteLine($"ISample {A + B}");

        // public 以外のアクセス指定
        protected void Add();

    }

    public class Sample : ISample
    {
        // インタフェースを実現したもの
        public int A { get; set; }
        public int B { get; set; }

        void ISample.Add() => Console.WriteLine($"Sample {A + B}");

        // デフォルト実装されたものは定義しなくてOK

        // クラス側の実装
        public void Calc() => Console.WriteLine($"Sample {A + B}");
    }

    class Program
    {
        static void Main(string[] args)
        {
            var s = new Sample { A = 10, B = 20 };

            // クラス側の実装はそのまま使える
            s.Calc();

            // インタフェース側のデフォルト実装はキャストして使う
            ((ISample)s).Output();
        }
    }
既存のコードへ影響しないようインタフェース側に処理を追加したいための機能だそうです。
基本文法
スポンサーリンク
C#プログラミング再入門