Return type when using curiously recurring template pattern
我在我的C项目中使用了奇怪的循环模板模式(crtp),但是我遇到了一些问题。从上面链接截取的代码:
1 2 3 4 5 6 7 8 | public abstract class Base<T> where T : Base<T>{ public T FluentMethod() { return (T)(this); } } public class Derived : Base<Derived> { } |
美丽的!当我尝试这样做时,问题就出现了:
1 2 3 4 | public class SomeClass { Base<T> GetItem() { /* Definition */ }; } |
有些类应该能够返回基类的任何实现,但是这里的t当然没有意义,因为它在另一个类中。将派生的而不是t编译,但这不是我想要的,因为只要它们是从基派生的,我也应该能够返回其他类型的项。另外,getItem()可能会根据someClass对象的状态返回不同的类型化对象,因此使someClass成为泛型也不是解决方案。
我是否遗漏了一些明显的东西,或者在使用CRTP时不能做到这一点?
必须将该方法声明为泛型:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | using System; 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<T>() where T : Base<T> { throw new NotImplementedException(); } } |
要使其成为属性,必须将类本身声明为泛型:
1 2 3 4 5 | public class SomeClass<T> where T : Base<T> { Base<T> GetItem { get { throw new NotImplementedException(); } } } |
不要将公共方法设为泛型,否则类型声明将达到另一个级别。为不同类型生成工厂类,如"derived getderividetem()"
1 2 3 4 5 6 7 | public class SomeClass { private Base<T> GetItem<T>() { /*implementation */ } public Derived GetDerivedItem() { return GetItem<Derived>(); } } |