3

私は現在、ジェネリック ステート マシンを構築してStateMachineおり、ジェネリック パラメーターを使用してのコンストラクターを使用して、マシンに何もすることがない場合に備えて、作成時にフォールバック状態を設定しています。

新しい状態オブジェクトを作成する必要があるときに状態マシン自体で使用されるコンストラクターと、状態マシンを初めて初期化するときに使用されるコンストラクターの 2 つを使用するのは悪い習慣ではないかと考えていました (デフォルトのフォールバック状態を設定します)。 .

私の最大の質問:ジェネリックを乱用していませんか? ジェネリックを使用してはいけない場合はありますか?

ステート マシンの作成:

//The generic parameter is the default "fallback" state.
_nodeStateMachine = new NodeStateMachine<IdleNodeState>();

ステート マシン コンストラクター:

public NodeStateMachine()
{
    _currentState = new T();
}

NodeStateMachineクラスで状態がどのように変更されるかを次に示します。

public void ChangeState<U>() where U : INodeState, new()
{
    _nextState = new U();
}

問題のコンストラクターは、状態自体に直接存在します。

public NullNodeState(){} // To use the class generically.

public NullNodeState(ConditionCheck check)
{
    _nullCheck = check;   
}
4

1 に答える 1

3

唯一の制限は状態の実装だけであるように見えるため、状態マシンがどのように一般的であるかはわかりませんINodeState。その場合、初期状態を指定する静的ファクトリ メソッドを作成します。

public class NodeStateMachine
{
    private INodeState _nextState;
    private NodeStateMachine(INodeState initial)
    {
        _nextState = initial;
    }

    public void ChangeState<U>() where U : INodeState, new()
    {
        _nextState = new U();
    }

    public static NodeStateMachine Create<T>() where T : INodeState, new()
    {
        return new NodeStateMachine(new T());
    }

    public static NodeStateMachine Create(INodeState initial)
    {
        return new NodeStateMachine(initial);
    }
}
于 2013-10-24T21:12:52.773 に答える