我有一个“最小状态”类型,其中包含一些数据并且可以生成另一个最小状态实例:
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
?)