关于c#:使用奇怪的重复模板模式时返回类型

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>();
    }
}