我在我的 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 在这里没有任何意义,因为它在另一个类中。将 Derived 而不是 T 编译,但这不是我想要的,因为我也应该能够返回其他类型的项目,只要它们从 Base 派生。此外,GetItem() 可能会根据 SomeClass 对象的状态返回不同类型的对象,因此使 SomeClass 通用也不是解决方案。
我在这里遗漏了一些明显的东西,还是在使用 CRTP 时不能这样做?