3

我目前正在构建一个通用状态机,并且我正在使用StateMachine带有通用参数的构造函数来设置创建时的回退状态,以防机器无事可做。

我想知道拥有两个构造函数是否是不好的做法,一个在需要创建新状态对象时由状态机本身使用,另一个在第一次初始化状态机时使用(设置默认回退状态) .

我最大的问题是:我是否在滥用泛型,是否有应该使用泛型的时候?

状态机创建:

//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 回答