2021年12月26日日曜日

総称型で型制約の異なるクラスでDecoratorパターンを適用するには

表題だけだと何のことかと思うので、とりあえずソースコードを見ていただけないでしょうか。
あ、環境はVisual Studio 2022のC#で、.NET 6でビルドして試しています。

簡単に言えば総称型+Decoratorパターンのサンプルです。

"1_IExecutable.cs"がDecoratorパターン用のインターフェースで、2~5がインターフェースの実装になります。
ただし3~5のクラスは、総称型に異なる型制約を持っています。
6が3~5のクラスの型制約をすべて満たすクラスになります。

そして"7_ExecutorFactory.cs"がインスタンスを作成するファクトリークラスとなります。
7でインスタンスの作成そのものはできていますが、型制約のないメソッドがあるせいでオーバーロードが効かず、メソッド名を変えざるを得なくなっています。
これだけでも少しかっこ悪いのですが、型制約の組み合わせごとにメソッドを追加していては、あっという間に組み合わせ爆発で作っていられなくなってしまいます。
1個のメソッドで解決するには、型制約のない総称型メソッドで型制約を持ったクラスのインスタンスを生成できる必要があります。
はたしてそんなことは可能なのでしょうか?
少なくとも、それを可能にする文法は無かったはずです。

さんざん悩んでひねり出したのが、"8_NewExecutorFactory.cs"となります。
結局リフレクションがすべてを解決するということで、リフレクションを使ってインスタンスを生成しています。
当然速度の遅さは気になるところなので、実際にはキャッシュさせたりしておかないといけなそうです。

もっと良い解決方法があるという方がいれば、ぜひ教えてくださーい。

0 件のコメント:

コメントを投稿