通用构造函数和继承

时间:2012-08-08 21:34:15

标签: c# generics constructor

我有一个带有类约束的泛型类。

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。我认为泛型类约束允许继承?我在这里做错了什么,有什么方法可以重新设计这些类来解决这个问题吗? 非常感谢任何回复。

2 个答案:

答案 0 :(得分:4)

基本上,你不能以这种方式使用泛型,因为协方差系统不能以的方式工作。见这里:http://geekswithblogs.net/abhijeetp/archive/2010/01/10/covariance-and-contravariance-in-c-4.0.aspx

可以然后使用这样的界面:

public interface MyContainer<out T> where T : MyBaseRow {

    }

该代码将编译。

答案 1 :(得分:2)

您可以创建协变通用接口(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)
    { }
  }