泛型构造函数和继承

本文关键字:继承 构造函数 泛型 | 更新日期: 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)
    { }
  }