C# 在派生类中设置泛型类型属性
我有一个泛型类型C# 在派生类中设置泛型类型属性,c#,generics,C#,Generics,我有一个泛型类型G,其中T:a,其中a是一个抽象类。在从A派生的每个类B中,我希望有一个类型为G的字段,而不必编写重复的代码,但是我不确定这是否可能。一种方法是 abstract class A { protected object g; protected abstract void SetG(); public A() { SetG(); } } class B : A { protected override void
G,其中T:a
,其中a
是一个抽象类。在从A
派生的每个类B
中,我希望有一个类型为G
的字段,而不必编写重复的代码,但是我不确定这是否可能。一种方法是
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() {}
}
抽象类A
{
受保护对象g;
受保护的抽象void SetG();
公共A()
{
SetG();
}
}
B类:A
{
受保护的覆盖无效设置()
{
this.g=新的g();
}
公共B():基(){}
}
但这意味着在每个派生类中都有大量重复的代码。有更好的方法吗?您可以在这两者之间添加一个额外的抽象类:
public abstract class A<T> : A where T : A
{
protected override void SetG()
{
this.g = new G<T>();
}
}
公共抽象类A:A,其中T:A
{
受保护的覆盖无效设置()
{
this.g=新的g();
}
}
…然后,将您的B声明更新为:
public class B : A<B>
{
public B() : base() { }
}
公共B类:A
{
公共B():基(){}
}
我相信你想做的是一件好事。请参见有关使用代理的内容,并查看这是否适用于您。请参阅“使用具有协变类型参数的委托”一节
在A:中,创建一个代理:
Func<G<A>> GetG;
Func-GetG;
然后,在派生类中,将此func指针设置为类型为的函数
Func<G<B>>
Func
宾果 嗯,是的,这肯定是一个比我更好的解决方案。谢谢我会等一段时间,以防别人想到什么这就是你要找的解决办法。不过,您可能需要考虑将类之间的名称命名为
A
。如果你想在其他地方看到这个模式,你也可以看看集合和它们的通用实现。哈!“说得好,@MattRowland!不知道我是怎么逃过这一劫的。:)更新答案以改为使用该名称。谢谢实际上,我想我还是把A
改成A
。谢谢大家,这是一个非常聪明的方法来“告诉”基类从中得到了什么。