我有一个泛型类型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() {}
}
但这意味着每个派生类中都会有大量重复的代码。有没有更好的方法可以做到这一点?
您可以在两者之间添加一个额外的抽象类:
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() { }
}
我相信您要做的是协变转换。请参阅这篇有关使用委托的 MSDN 文章,看看它是否适合你。查看"将委托与协变类型参数结合使用"部分。
在 A: 中,创建一个委托:
Func<G<A>> GetG;
然后,在派生类中,将此 func 指针设置为类型的函数
Func<G<B>>
宾果游戏!