Универсальный пустой перегруженный конструктор и когда не использовать обобщенные

В настоящее время я строю универсальный конечный автомат, и я использую конструктор 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;   
}

1 ответ

Решение

Я не вижу, как конечный автомат является общим, так как кажется, что единственным ограничением является реализация состояний 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);
    }
}
Другие вопросы по тегам