尝试在 C# 中实现有限状态机但无法转换派生类型
Trying to implements Finite State Machine in C# but cannot convert derived type
我正在尝试实现一个带有上下文 class 和多个状态 class 的最小状态机。
这里有两条对我很重要的规则:
- 上下文 class 应该没有关于状态 class 的实现(添加新状态 class 不需要更改上下文 class)
- 状态之间的转换仅在源状态上实现
这里是通用实现:
public abstract class ContextState
{
protected State<ContextState> currentState;
public void Update()
{
currentState.Update();
}
public void SetState(State<ContextState> state)
{
currentState = state;
state.Start(this);
}
}
public abstract class State<C> where C:ContextState
{
protected C context;
public void Start(C context)
{
this.context = context;
}
abstract public void Update();
abstract public void Exit();
protected void SetNewState<S>() where S : State<ContextState>,new()
{
Exit();
context.SetState(new S());
}
}
现在我尝试将这些 class 实现到实际应用程序中:
public class CarConfigurationContext : ContextState
{
public CarConfigurationContext()
{
SetState(new PlayCarState());
}
}
public class PlayCarState : State<CarConfigurationContext>
{
public override void Exit()
{
...
}
public override void Update()
{
...
}
}
我在 SetState(new PlayCarState());
处遇到编译错误
无法从 PlayCarState
转换为 State<ContextState>
在 Whosebug 上搜索后,一种可能的解决方案是使用接口而不是抽象 class 但我想在 ContextState 和 State 中保留我的通用实现。
如果您对我如何在保持与我相同的概念的同时解决这个问题有任何想法,我将不胜感激。
谢谢
注意:我也有一个循环引用的问题,但是因为我在C#上工作,所以还没有考虑这个。
note2: 泛型实现还没说完,其实我在想哪些方法应该是virtual,哪些地方应该调用Start和Exit
目前我找到的唯一解决方案是将 State class 的实现更改为 PlayCarState:State<ContextState>
,然后在 Start 方法中从 ContextState 动态转换为 CarContextState。这是部分安全和干净的,但我想知道是否有更好的解决方案。
我正在尝试实现一个带有上下文 class 和多个状态 class 的最小状态机。
这里有两条对我很重要的规则:
- 上下文 class 应该没有关于状态 class 的实现(添加新状态 class 不需要更改上下文 class)
- 状态之间的转换仅在源状态上实现
这里是通用实现:
public abstract class ContextState
{
protected State<ContextState> currentState;
public void Update()
{
currentState.Update();
}
public void SetState(State<ContextState> state)
{
currentState = state;
state.Start(this);
}
}
public abstract class State<C> where C:ContextState
{
protected C context;
public void Start(C context)
{
this.context = context;
}
abstract public void Update();
abstract public void Exit();
protected void SetNewState<S>() where S : State<ContextState>,new()
{
Exit();
context.SetState(new S());
}
}
现在我尝试将这些 class 实现到实际应用程序中:
public class CarConfigurationContext : ContextState
{
public CarConfigurationContext()
{
SetState(new PlayCarState());
}
}
public class PlayCarState : State<CarConfigurationContext>
{
public override void Exit()
{
...
}
public override void Update()
{
...
}
}
我在 SetState(new PlayCarState());
处遇到编译错误
无法从 PlayCarState
转换为 State<ContextState>
在 Whosebug 上搜索后,一种可能的解决方案是使用接口而不是抽象 class 但我想在 ContextState 和 State 中保留我的通用实现。
如果您对我如何在保持与我相同的概念的同时解决这个问题有任何想法,我将不胜感激。
谢谢
注意:我也有一个循环引用的问题,但是因为我在C#上工作,所以还没有考虑这个。
note2: 泛型实现还没说完,其实我在想哪些方法应该是virtual,哪些地方应该调用Start和Exit
目前我找到的唯一解决方案是将 State class 的实现更改为 PlayCarState:State<ContextState>
,然后在 Start 方法中从 ContextState 动态转换为 CarContextState。这是部分安全和干净的,但我想知道是否有更好的解决方案。