c# - 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>
回报为空?
解决方案
你的问题是,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
}
}
另请参阅使用此技巧获得所需功能的此答案。
推荐阅读
- sql-server - sql server 导出表格到excel
- sql-server - SQL Server 链接服务器配置
- regex - 用于拆分字符串的正则表达式,使用空格,除非在引号和括号内
- c - 为什么这个 C 程序显示这个结果?
- javascript - 为什么有些条在 d3 条形图中偏离中心?
- rest - 使用 ambari rest-api 使用 powershell
- xslt - 从优先级列表中选择元素的值
- mysql - 如何从另一个表中动态检索最近的日期 MySQL
- datetimepicker - datetimepicker 默认为当前时间戳
- xcode10 - xcodebuild 对 mac 应用程序进行公证并等待响应?