C# - 编码嵌套状态流图

时间:2012-11-30 16:39:14

标签: c# uml state state-machine state-diagram

我有以下状态图。我知道如何创建一个在非嵌套状态之间转换的简单状态机;但是,我不知道如何在嵌套状态之间转换。有人可以解释如何在适当的高水平上做到这一点(也就是说,你不需要为我编写代码 - 除非你感觉特别慷慨:P)。

我想要建模[已修改,基于建议]

State Diagram: what I'm trying to implement

我知道如何实施(下面的代码)

State Diagram: I know how to implement this

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”子状态

1 个答案:

答案 0 :(得分:0)

您可能希望实际为通过X移动的P,AB,CD和EF创建状态机。每个状态都将配置子状态机。 “主”状态机将通过X转换通过P,AB,CD和EF移动,而子状态机将通过Y转换在中性非中性方向上移动。如果我需要更详细地详细说明,请告诉我。