我有以下状态图。我知道如何创建一个在非嵌套状态之间转换的简单状态机;但是,我不知道如何在嵌套状态之间转换。有人可以解释如何在适当的高水平上做到这一点(也就是说,你不需要为我编写代码 - 除非你感觉特别慷慨:P)。
我想要建模[已修改,基于建议]
我知道如何实施(下面的代码)
public class MyState : State // State enumeration
{
public static MyState A = new MyState("State A");
public static MyState B = new MyState("State B");
public static MyState C = new MyState("State C");
public static MyState D = new MyState("State D");
public static MyState E = new MyState("State E");
public static MyState F = new MyState("State F");
public static MyState NEUT = new MyState("Neutral");
public static MyState P = new MyState("P");
protected MyState(string name) : base(name) { }
}
public class MyEvent : Event // Event enumeration
{
public static MyEvent X_POS = new MyEvent("X+");
public static MyEvent X_NEG = new MyEvent("X-");
public static MyEvent Y_POS = new MyEvent("Y+");
public static MyEvent Y_NEG = new MyEvent("Y-");
protected MyEvent(string name) : base(name) { }
}
// State Machine implementation
public class MyStateMachine : StateMachine<MyState, MyEvent>
{
public MyStateMachine() : base(MyState.P) // MyState.P = initial state
{ // Set up the transition table
// P
this.addTransition(MYState.P, MyState.NEUT, MyEvent.Y_NEG);
// NEUTRAL
this.addTransition(MyState.NEUT, MyState.P, MyEvent.Y_POS);
this.addTransition(MyState.NEUT, MyState.A, MyEvent.Y_NEG);
this.addTransition(MyState.NEUT, MyState.B, MyEvent.Y_POS);
this.addTransition(MyState.NEUT, MyState.C, MyEvent.Y_NEG);
this.addTransition(MyState.NEUT, MyState.D, MyEvent.Y_POS);
this.addTransition(MyState.NEUT, MyState.E, MyEvent.Y_NEG);
this.addTransition(MyState.NEUT, MyState.F, MyEvent.Y_POS);
// A
this.addTransition(MyState.A, MyState.NEUT, MyEvent.Y_POS);
// B
this.addTransition(MyState.B, MyState.NEUT, MyEvent.Y_NEG);
// C
this.addTransition(MyState.C, MyState.NEUT, MyEvent.Y_POS);
// D
this.addTransition(MyState.D, MyState.NEUT, MyEvent.Y_NEG);
// E
this.addTransition(MyState.E, MyState.NEUT, MyEvent.Y_POS);
// F
this.addTransition(MyState.F, MyState.NEUT, MyEvent.Y_NEG);
}
public void move(MyEvent eevent)
{
try
{
this.moveNext(eevent);
}
catch (Exception e) { }
}
}
编辑:我认为问题的关键在于如何在转换依赖于当前子状态时说明/实现从给定超级状态的子状态到不同超状态的子状态的转换。原来超级大国。使用我的例子,如果当前状态为超级“中性”内的“P”,我如何说明/实现我的状态机以显示事件Y +将完全从中立超级状态转换为“非中立”超级状态,并且特别注入“P”子状态。
答案 0 :(得分:0)
您可能希望实际为通过X移动的P,AB,CD和EF创建状态机。每个状态都将配置子状态机。 “主”状态机将通过X转换通过P,AB,CD和EF移动,而子状态机将通过Y转换在中性非中性方向上移动。如果我需要更详细地详细说明,请告诉我。