Template Method Pattern C# 8.0風味


Template Method Pattern C# 8.0風味

C# 8.0の機能を活用して、今までのパターンを書き換えることができそうなので、少し記事を書いてみます。
新手法なのか、機能の悪用なのかは、今のところ判断しかねているところです(^^;

調理前(C# 7.3以前)

3つの抽象メソッドを順番に呼ぶExecute()メソッドを持つ、単純なサンプルです。

public abstract class AbstractWorker {

    protected abstract void Begin();
    protected abstract void Do();
    protected abstract void End();

    public void Execute() {
        Begin();
        Do();
        End();
    }
}

public class MyWorker : AbstractWorker {

    protected override void Begin() => Console.WriteLine("▽▽▽");
    protected override void Do() => Console.WriteLine("Do");
    protected override void End() => Console.WriteLine("△△△");

    public static AbstractWorker Create() => new MyWorker();
}

調理後(C# 8.0風味)

抽象クラスで書いていた箇所を、C# 8.0 で追加されたインターフェイスの既定メンバー 機能で置き換えたものです。

public interface IWorker {

    protected void Begin();
    protected void Do();
    protected void End();

    sealed void Execute() {
        Begin();
        Do();
        End();
    }
}

public class MyWorker : IWorker {

    void IWorker.Begin() => Console.WriteLine("▽▽▽");
    void IWorker.Do() => Console.WriteLine("Do");
    void IWorker.End() => Console.WriteLine("△△△");

    public static IWorker Create() => new MyWorker();
}

インターフェイスでは既定でpublicかつabstractのため、多少の違いはあるものの、ほぼほぼ同じ書き方で同じ機能を実現できました。

まとめ

C# 8.0 にてインターフェイスメンバーの既定実装の機能が追加されました。これはインターフェイスのバージョンアップを容易にするための機能です。

ですが、それだけでない機能追加があることも見逃せません。みなさんも新たな機能で何ができるか試してみて、何か見つけたらQiitaで教えてください。