3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Template Method Pattern C# 8.0風味

Posted at

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

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?