3

我正在尝试基于状态模式的修改版本使用方法作为状态而不是类来实现一个简单的状态机,如下所示:

private Action<Input> currentState;
private void NextState(Input i) {
    currentState(i);
}

private void State1(Input i) {
    if( i ... )
        currentState = State1;
    else
        currentState = State2;
}

private void State2(Input i) {
    if( i ... )
        currentState = State1;
    else
        currentState = State2;  
}

但如果我能这样做会更优雅:

private void NextState(Input i) {
    currentState = currentState(i);
}

private Func<xxx> State1() {
    if( i ... )
        return State1;
    else
        return State2;
}

但我不知道如何写这个Func。有没有办法做到这一点?

4

3 回答 3

4

如果您想使用返回的函数void,请尝试使用Action

private Action State1() {
    if( ... )
        return State1Inner;
    else
        return State2Inner;
}

如果要使用返回具有自己签名的函数的函数,则必须首先定义自定义委托类型。这是一个通用版本:

public delegate State<T> State<T>(T input);

private State<int> State1(int input) {
    if( ... )
        return State1;
    else
        return State2;
}

这将帮助您避免使用内部状态函数。

于 2013-03-25T03:23:40.633 回答
1

您可能想看看这篇文章,它讨论了使用 yield 语句来执行状态机。例如,这通常在 Unity3d 游戏引擎中完成。(这里的另一个讨论)

于 2013-03-25T04:13:16.253 回答
0

如果您想将方法用作状态并“一般”地引用它们,则需要函数指针。我不熟悉 c# 中的语法,但在 c++ 中,您可以将指针传递给函数,并使用其指针调用该函数。从本质上讲,这意味着将函数用作参数/变量 - 将使用的操作,但在运行时之前是未知的。

看看函数指针,我认为这会让你到达你需要的地方,尽管我很好奇你在这里所做的事情的本质。

如果您正在使用 c#,它使用称为函数委托而不是指针的东西。在这里阅读:http: //msdn.microsoft.com/en-us/library/ms173171.aspx

于 2013-03-25T03:36:54.220 回答