私の C# プロジェクトで奇妙な繰り返しテンプレート パターン(CRTP) を使用していますが、いくつか問題があります。上記のリンクから抜粋したコード:
public abstract class Base<T> where T : Base<T>{
public T FluentMethod() {
return (T)(this);
}
}
public class Derived : Base<Derived> {
}
美しい!次のようなことをしようとすると、問題が発生します。
public class SomeClass
{
Base<T> GetItem() { /* Definition */ };
}
SomeClass は Base クラスの任意の実装を返すことができるはずですが、もちろん T は別のクラスにあるため、ここでは意味がありません。T コンパイルの代わりに Derived を配置しますが、Base から派生している限り、他のタイプのアイテムも返すことができるはずなので、これは私が望むものではありません。また、GetItem() は SomeClass オブジェクトの状態に応じて異なる型のオブジェクトを返す可能性があるため、SomeClass をジェネリックにすることも解決策ではありません。
ここで明らかな何かが欠けていますか、それとも CRTP の使用中にこれを行うことはできませんか?