いくつかのデータを含み、最小状態の別のインスタンスを生成できる「最小状態」タイプがあります。
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
はまだ のサブタイプでMinimalState
はIState<State>
なく、 のサブタイプでもありませんIMinimalState<MinimalState>
。他の多くの組み合わせを試しましたが、成功しませんでした。
IState
のサブタイプを作成する方法はありIMinimalState
ますか? そうでない場合は、
.Net 型システムが十分に強力ではないためですか?
IState
または、それが本当にのサブタイプであると考えるのは間違っていますIMinimalState
か?IMinimalState
(必要なものがを受け取った場合にプログラムがクラッシュするシナリオはありIState
ますか?)