在C#中返回基类的子类型?

时间:2014-02-18 10:17:03

标签: c# .net generics inheritance

我有一个类层次结构,我希望每个类都返回一个自己的类型而不是基类的类型

我知道我必须在Base类中使用泛型

abstract class Base<T> where T : Base<T>
{
    public T Foo() { ... }
}

class Sub : Base<Sub> { ... }
new Sub().Foo(); //returns Sub

现在我的问题是,如果我想继承派生类

,我该怎么办?
class SubSub : Sub { ... }
new SubSub().Foo(); //returns Sub and not SubSub 

我可以使子类也通用

abstract class Sub<T> : Base<Sub<T>> where T : Sub<T> { ... }
abstract class SubSub<T> : Sub<SubSub<T>> where T : Sub<SubSub<T>> { ... }

但是现在我必须为每个继承创建2个类。 1个抽象泛型类,它是实际的类,1个类只是获取抽象和泛型

abstract class _Sub<T> : Base<_Sub<T>> where T : _Sub<T> { ... }
class Sub : _Sub<Sub> { ... }

abstract class _SubSub<T> : _Sub<_SubSub<T>> where T : _SubSub<T> { ... }
class SubSub : _SubSub<SubSub> { ... }

这会做我想要的但我不认为这是一个干净的解决方案

我必须使用2个类才能创建新实例

class Sub<T> : Base<Sub<T>> where T : Sub<T> { ... }
var a = new Sub</* -- I think there is no valid option that could go here -- */>();

有没有干净/最佳实践方法来做我想要的事情?或者我的方式已经很干净了,我觉得它很难看?

1 个答案:

答案 0 :(得分:0)

我认为这与您所寻找的非常接近:

abstract class Base<T> where T : Base<T>
{
    public T Foo()
    {
        return default(T);
    }
}

class Sub<T> :Base<T> where T : Base<T>
{

}

class SubSub : Sub<SubSub> 
{

}

现在你可以用这种方式创建一个SubSub:

var subSub = new SubSub();
SubSub subSubResult = subSub.Foo();

但是现在很难创建一个子......