在派生类中设置泛型类型属性



我有一个泛型类型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>>

宾果游戏!

最新更新