我有一个泛型G<T> where T : A
,其中A
是一个抽象类。在从B
派生的每个类A
中,我想要一个类型为G<B>
的字段,而不是编写重复代码,但是我不确定它是否可能。一种方法是
abstract class A
{
protected object g;
protected abstract void SetG();
public A()
{
SetG();
}
}
class B : A
{
protected override void SetG()
{
this.g = new G<B>();
}
public B() : base() {}
}
但这意味着每个派生类中都会有很多重复代码。有更好的方法吗?
答案 0 :(得分:6)
您可以在其间添加一个额外的抽象类:
public abstract class A<T> : A where T : A
{
protected override void SetG()
{
this.g = new G<T>();
}
}
...然后,将您的B声明更新为:
public class B : A<B>
{
public B() : base() { }
}
答案 1 :(得分:0)
我相信你要做的是Covariant Conversion。有关使用委托的信息,请参阅此MSDN article,看看它是否适合您。请查看&#34;使用具有协变类型参数的代理&#34;。
在你的A:中,创建一个委托:
Func<G<A>> GetG;
然后,在派生类中,将此func指针设置为类型
的函数Func<G<B>>
宾果!