微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#状态机状态更改委托

如何解决C#状态机状态更改委托

我一直在尝试构建自己的通用状态机,但我想不出一种将状态更改与事件联系起来的方法

目前,我的通用实现如下:

public interface IStateRoot
{

}
public interface IState<T> where T: IStateRoot
{

}

public abstract class State<T> : IState<T> where T: IStateRoot
{
    public delegate void OnChange(IState<T> state);
    OnChange OnStateChange;

    public void Invoke()
    {
        OnStateChange?.Invoke(this);
    }
}
public class FSM<T> where T: IStateRoot
{
    public delegate void TransitionDelegate<K>(IState<K> state) where K: T;
    public Dictionary<Type,TransitionDelegate<T>> Transitions;
    public State<T> State { get; set; }
    public FSM()
    {
        Transitions = new Dictionary<Type,TransitionDelegate<T>>();
    }
    public FSM(State<T> init)
    {
        Transition(init);
    }

    public void Transition<K>(K nextState) where K : State<T>
    {
        if (Transitions.TryGetValue(typeof(K),out var value))
        {
            value?.Invoke(nextState);
        }
        State = nextState;
    }

    public void OnTransition<K>(State<K>.OnChange action) where K : T
    {
        if (Transitions.TryGetValue(typeof(K),out var value))
        {
            value += action;
            return;
        }

        Transitions.Add(typeof(K),action);
    }

}

一个完美的世界中,我希望能够像这样创建自己的StateRoot和他的States

 public class MyState : IStateRoot
{
    public class InitState : State<MyState> { }

    public class EndState : State<MyState> { }

}

然后像这样使用它

 public class StateListener
{
    public FSM<MyState> StateMachine;

    public StateListener()
    {
        StateMachine = new FSM<MyState>();
        StateMachine.OnTransition<MyState.InitState>(OnInit);
        StateMachine.OnTransition<MyState.EndState>(OnEndState);
        StateMachine.Transition(new MyState.InitState());
    }

    public void OnEndState(MyState.EndState state)
    {
        Console.WriteLine("EndState");
    } 

    public void OnInit(MyState.InitState state)
    {
        Console.WriteLine("StartState");
    }
}

我在将通用方法挂接到OnTransition时遇到问题。

我遇到的问题是我无法在OnTransitionMethod中从State<K>.OnChange转换为FSM<T>.TransitionDelegate<K>。我不知道该怎么办。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?