4

クラス制約のあるジェネリッククラスがあります。

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)
    { }
}

コンストラクターでMyAliExpressRowAを許可しません。コンパイラーは、MyBaseRowのみを予期し、許可します。ジェネリッククラスの制約で継承が可能だと思いましたか?ここで何が間違っているのでしょうか。これを回避するためにこれらのクラスを再設計する方法はありますか?ご回答ありがとうございます。

4

2 に答える 2

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 {

    }

そして、そのコードはコンパイルされます。

于 2012-08-08T21:48:50.450 に答える
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)
    { }
  }
于 2012-08-08T21:54:34.070 に答える