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
。谢谢大家,这是一个非常聪明的方法来“告诉”基类从中得到了什么。