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