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 に答える