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で教えてください。