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
以上です。