首页 > 解决方案 > C# 将子类转换为其抽象泛型父类

问题描述

我的程序结构:

我有两个抽象类。用于不同类型测试的 TestBase 类和用于不同类型测试集合的 TestBaseLayer。它们看起来像这样:

public abstract class TestBaseLayer<T> where T : TestBase
{
    public abstract List<T> Tests { get; set; }
}

每个 TestBase 都有一个对包含它的 TestBaseLayer 的引用:

public abstract class TestBase
{
    public TestBaseLayer<TestBase> BaseLayer { get; set; }
    public TestBase(TestBaseLayer<TestBase> layer){
        BaseLayer = layer;
    }
}

我有一个TestPointLayer 类,它是TestPoint 的TestBaseLayer。TestPointLayer 和 TestPoint 如下所示:

public class TestPoint : TestBase
{
    public TestPoint(TestPointLayer layer) : base(layer as TestBaseLayer<TestBase>) { }
}

public class TestPointLayer : TestBaseLayer<TestPoint>
{
    public override List<TestPoint> Tests { get; set; }
}

问题:

当我创建一个将 TestPointLayer 对象传递给 TestPoint 构造函数的 TestPoint 实例时,我需要使用 TestPointLayer 作为 TestBaseLayer 来调用基本构造函数。理论上我认为它是,但我的layer as TestBaseLayer<TestBase>回报为空?

标签: c#inheritance

解决方案


你的问题是,TestBaseLayer<TestPoint>并且TestBaseLayer<T>是不同的类型。以下是使用嵌套约束类型解决此问题的方法。TestBase使用对派生类型的引用进行泛型。所以TestBase<T>需要一个T派生自TestBase<T>.

public abstract class TestBaseLayer<T> where T : TestBase<T>
{
    public abstract List<T> Tests { get; set; }
}

public abstract class TestBase<T> where T: TestBase<T>
{
    public TestBaseLayer<T> BaseLayer { get; set; }
    public TestBase(TestBaseLayer<T> layer)
    {
        BaseLayer = layer;
    }
}


public class TestPoint : TestBase<TestPoint>
{
    public TestPoint(TestPointLayer layer) : base(layer)
    {
        layer.Tests.Add(this);
    }
}

public class TestPointLayer : TestBaseLayer<TestPoint>
{
    public override List<TestPoint> Tests { get; set; }
}

class Program
{
    static void Main(string[] args)
    {

        var list = new TestPointLayer();
        var test1 = new TestPoint(list);
        var test2 = new TestPoint(list);

        Debug.WriteLine(list.Tests.Count);
        // 2
    }
}

另请参阅使用此技巧获得所需功能的此答案。


推荐阅读