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

Dun*_*nno 2 c# generics

我有一个泛型类型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() {}
}
Run Code Online (Sandbox Code Playgroud)

但这意味着每个派生类中都会有很多重复代码.有一个更好的方法吗?

wab*_*lab 6

您可以在其间添加一个额外的抽象类:

public abstract class A<T> : A where T : A
{
    protected override void SetG()
    {
        this.g = new G<T>();
    }
}
Run Code Online (Sandbox Code Playgroud)

...然后,将您的B声明更新为:

public class B : A<B>
{
    public B() : base() { }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是你正在寻找的解决方案.您可能要想想刚刚命名像`A <T>`类之间虽然.如果你想看到这种模式在其他地方,你可以看一下收藏和他们的通用实现也. (2认同)