Я использую Stateless для реализации FSM в нескольких классах.(http://code.google.com/p/stateless/)
Я хочу использовать базовый класс для запуска триггеров и ведения журнала и т. Д. Я также хочу обеспечить, чтобы любой класс, наследующий мой класс baseFSM, реализовывал StateMachine со своими собственными локальными состояниями и триггерами.
Однако моя проблема в том, что перечисления нельзя абстрагировать или передавать функциям.
Кстати, Stateless говорит: «Общая поддержка состояний и триггеров любого типа .NET (числа, строки, перечисления,и т.д.) ", так что, если есть лучший способ сделать это, дайте мне знать.
В идеале это то, что я хотел бы реализовать (или что-то, что может работать так же).
BaseFSM класс:
public abstract class BaseFSM : IStateMachine
{
#region Implementation of IStateMachine
public ICall LocalCall { get; set; }
#endregion
internal abstract enum State {}
internal abstract enum Trigger {}
internal abstract StateMachine<State, Trigger> fsm { get; set; }
public abstract void Fire(Enum trigger);
}
Класс, который реализует BaseFSM:
class Incoming_Initial : BaseFSM
{
private enum State
{
WaitForCallToBeAnswered,
CallConnected,
CallNeverConnected,
CheckForCustomIntro,
PlayIntro,
PlayPleaseEnterPin,
ReadLanguageSettings,
ChooseLanguage,
ValidatePIN,
PINWasInvalid,
IdentifyUser
}
private enum Trigger
{
Yes,
No,
DigitPressed,
PromptDonePlaying,
PromptTimerElapse,
Done
}
public Incoming_Initial(ICall call)
{
LocalCall = call;
fsm = new StateMachine<this.State, this.Trigger>(State.WaitForCallToBeAnswered);
....
ИЛИ Я бы даже взял что-то вроде этого:
public class myStateMachine
{
private enum State{}
private enum Trigger{}
private StateMachine<State, Trigger> stateMachine;
public myStateMachine (Enum _states, Enum _triggers, Enum _startState)
{
State = _states;
Trigger = _triggers;
stateMachine = new StateMachine<State, Trigger>(_startState);
}
}
Любое понимание того, какЯ могу приступить к реализации, и я буду очень признателен за это!
Редактировать : Моя конечная цель - использовать Stateless для реализации системы IVR ( IVR ), которая имеет ~ 40 различныхФСМ. Государственные машины сбудет нести ответственность за поток вызовов и за то, как пользователь взаимодействует с системой.У меня уже работает демо-конечный автомат, но состояния и триггеры локальны для этого класса.
Я просто пытаюсь понять, смогу ли я вывести конечный автомат в базовый класс, чтобы мне не приходилось передавать конечный автомат вспомогательным функциям.
Если я могу поместить конечный автомат в базовый класс, я думаю, что я мог бы использовать один набор триггеров (это были бы события от телефонного звонка, такие как CallConnected, UserPressedDigit, CallDisconnected, PromptDonePlaying и т. Д.) И иметь толькореализовать состояния для каждого FSM.
ОТВЕТ (по крайней мере, как я использую это) благодаря @phoog:
public abstract class BaseFSM <TState> : IStateMachine
{
#region Implementation of IStateMachine
public ICall LocalCall { get; set; }
#endregion
public enum Triggers
{
Yes = 0,
No,
DigitPressed,
PromptDonePlaying,
PromptTimerElapse,
Done
}
protected IList<TState> States { get; set; }
protected StateMachine<TState, Triggers> fsm { get; set; }
...
class Incoming_Initial : BaseFSM<Incoming_Initial.State>
{
internal enum State
{
WaitForCallToBeAnswered,
CallConnected,
CallNeverConnected,
CheckForCustomIntro,
PlayIntro,
PlayPleaseEnterPin,
ReadLanguageSettings,
ChooseLanguage,
ValidatePIN,
PINWasInvalid,
IdentifyUser
}
public Incoming_Initial(ICall call)
{
LocalCall = call;
LocalCall.CallEventHandler += new CallEventHandler(LocalCall_CallEventHandler);
States = (State[]) Enum.GetValues(typeof (State));
fsm = new StateMachine<State, Triggers>(State.WaitForCallToBeAnswered);