1

いくつかのデータを含み、最小状態の別のインスタンスを生成できる「最小状態」タイプがあります。

public interface IMinimalState
{
   IMinimalState generate();
   int getData();
}

また、より多くのデータを含み、通常状態のインスタンスを生成できる「通常状態」もあります。

public interface IState
{
   IState generate();
   int getData();
   int getAnotherData();
}

私が知る限り、IState は IMinimalState のサブタイプである必要があります。(IMinimalState を必要とするものはすべて、IState を取得したときに同じように満足するはずです) ただし、コンパイラにそれを受け入れさせることはできません。

例:

   public interface IMinimalState
   {
      IMinimalState generate();
      int getData();
   }

   public interface IState : IMinimalState
   {
      int getAnotherData();
   }

   public class MinimalState : IMinimalState
   {
      public IMinimalState generate() { return this; }
      public int getData() { return 0; }
   }

   public class State : IState
   {
      public IState generate() { return this; }  //Compiler Error, return type should be IMinimalState
      public int getData() { return 1; }
      public int getAnotherData() { return 2; }
   }

では、ジェネリック インターフェイスを試してみましょう。

   public interface IMinimalState<out T> where T : IMinimalState<T>
   {
      T generate();
      int getData();
   }

   public interface IState<out T> : IMinimalState<T> where T : IState<T>
   {
      int getAnotherData();
   }

   public class MinimalState : IMinimalState<MinimalState>
   {
      public MinimalState generate() { return this; }
      public int getData() { return 0; }
   }

   public class State : IState<State>
   {
      public State generate() { return this; }
      public int getData() { return 1; }
      public int getAnotherData() { return 2; }
   }

コンパイラ エラーはまだありません。しかしStateはまだ のサブタイプでMinimalStateIState<State>なく、 のサブタイプでもありませんIMinimalState<MinimalState>。他の多くの組み合わせを試しましたが、成功しませんでした。

IStateのサブタイプを作成する方法はありIMinimalStateますか? そうでない場合は、

  • .Net 型システムが十分に強力ではないためですか?

  • IStateまたは、それが本当にのサブタイプであると考えるのは間違っていますIMinimalStateか? IMinimalState(必要なものがを受け取った場合にプログラムがクラッシュするシナリオはありIStateますか?)

4

4 に答える 4

2

new キーワードを使用して の戻り値の型を変更し、クラス内でgenerateの両方のバリエーションを実装できます。generateState

   public interface IMinimalState
   {
      IMinimalState generate();
      int getData();
   }

   public interface IState : IMinimalState
   {
      new IState generate();      
      int getAnotherData();
   }

   public class State : IState
   {
      public IState generate() { return this; } 
      IMinimalState IMinimalState.generate() { return  generate(); }           
      ...
   }
于 2013-04-24T11:41:01.457 に答える
0

これはインターフェイスが言うことなので、IMinimalState を返す必要があります。

public class State : IState
{
  public IMinimalState generate() { return this; }  // Fixed
  public int getData() { return 1; }
  public int getAnotherData() { return 2; }
}

後で IMinimalState の参照で IState メンバーにアクセスする必要がある場合は、キャストする必要があります

var state = minimalState as IState;
if (state != null)
{
    // Work on IState
}
于 2013-04-24T11:47:20.343 に答える
0

ジェネリックを使用できます:

public interface IMinimalState<T>
{
    T generate();
    int getData();
}

public interface IState : IMinimalState<IState>
{
    IState generate();
    int getAnotherData();
}
于 2013-04-24T11:48:01.823 に答える