泛型构造函数和继承
本文关键字:继承 构造函数 泛型 | 更新日期: 2024-11-08 02:45:32
我有一个泛型类,上面有一个类约束。
public class MyContainer<T> where T : MyBaseRow
MyBaseRow 是一个抽象类,我也想包含 MyContainer 某种风格的成员。
public abstract class MyBaseRow
{
public MyContainer<MyBaseRow> ParentContainer;
public MyBaseRow(MyContainer<MyBaseRow> parentContainer)
{
ParentContainer = parentContainer;
}
}
我在使用从 MyBaseRow 继承的类的构造函数时遇到问题,例如。
public class MyInheritedRowA : MyBaseRow
{
public MyInheritedRowA(MyContainer<MyInheritedRowA> parentContainer)
: base(parentContainer)
{ }
}
不允许构造函数中的 MyInheritedRowA,编译器只期望并且只允许 MyBaseRow。我认为通用类约束允许继承?我在这里做错了什么,有什么方法可以重新设计这些类来解决这个问题吗?提前非常感谢任何回复。
基本上,你不能以这种方式使用泛型,因为协方差系统对类不是这样工作的。看这里: http://geekswithblogs.net/abhijeetp/archive/2010/01/10/covariance-and-contravariance-in-c-4.0.aspx
但是,您可以使用如下接口:
public interface MyContainer<out T> where T : MyBaseRow {
}
该代码将编译。
您可以创建一个协变泛型接口 (C#4.0):
public interface IContainer<out T> where T : MyBaseRow
{
}
public class MyContainer<T> : IContainer<T> where T : MyBaseRow
{
}
public abstract class MyBaseRow
{
public IContainer<MyBaseRow> ParentContainer;
public MyBaseRow(IContainer<MyBaseRow> parentContainer)
{
ParentContainer = parentContainer;
}
}
public class MyInheritedRowA : MyBaseRow
{
public MyInheritedRowA(IContainer<MyInheritedRowA> parentContainer)
: base(parentContainer)
{ }
}