我有一个类层次结构,我希望每个类都返回一个自己的类型而不是基类的类型
我知道我必须在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 -- */>();
有没有干净/最佳实践方法来做我想要的事情?或者我的方式已经很干净了,我觉得它很难看?
答案 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();
但是现在很难创建一个子......