C#のインタフェースでテンプレートメソッドパターン

9月ももう末ですね。
ようやく涼しくなって来てありがたいです。今夏は暑すぎました。。。

最近今更のように少しずつデザインパターンを学習(再学習含む)しています。
学習中にJavaのコードをC#で書き換える写経をしています。

そんな中でAbstractクラスで実装されがちなテンプレートメソッドパターンを
C#の場合はインタフェースのみで実現できることに気が付きました。
(Javaはおそらく完全な実現は無理そうです、
 インタフェースでfinal defaultなメソッドは宣言できないみたいなので)

実現方法は
「C#8.0でインタフェースにデフォルト実装メソッドを定義し、sealedで修飾」
です。

実現例:

/// <summary> 表示インタフェース </summary>
public interface IDisplay {
    /// <summary> オープンします。 </summary>
    void Open();
    /// <summary> プリントします。 </summary>
    void Print();
    /// <summary> クローズします。 </summary>
    void Close();

    /// <summary> 表示します。 </summary>
    sealed void Display() {
        Open();
        Print();
        Close();
    }
}

「C#8.0以降なら似たようなことをできるものの
 C#にはfinal修飾子がないため実現できない」と思っていたのですが、
デフォルト実装したメソッドをsealedで修飾可能なことに今更気付きました。
(というかそもそもメソッドにsealed修飾できることを知りませんでした)

これならデフォルト実装したテンプレートメソッドを
継承先のクラスにより上書きされてしまうことを防げますね。

実際にテンプレートメソッドパターンを実装することはあまりないかもしれませんが、
インタフェースにsealedなデフォルト実装メソッドを宣言可能なことは
知っているといずれ役立ちそうな気がします。

※調べてみると2019年に既に気付いていた方がおりますね。
 もしかして皆さん知っておられるのでしょうか。

Template Method Pattern C# 8.0風味 #デザインパターン – Qiita

以上です。

コメントを残す