2013-10-24 58 views
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; 
} 

回答

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); 
    } 
}