我正在使用無狀態來實現多個類中的FSM。 (http://code.google.com/p/stateless/)基本枚舉的本地實例或傳遞枚舉集合?
我想用一個基類激活觸發器和記錄等。 我也想強制執行,任何類繼承我的baseFSM類實現自己的本地國和觸發狀態機。
但是我的問題是,枚舉的不能被抽象或傳遞給函數。順便說一下,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);
....
OR我甚至會採取這樣的事情:
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);
}
}
我如何能去任何有識之士關於實施這個將不勝感激!
編輯:我的最終目標是使用無狀態來實現具有40個不同FSM的IVR(IVR)系統。狀態機將負責呼叫流程以及用戶與系統的交互方式。我已經有一個演示狀態機工作,但狀態和觸發器是本地的。
我只是想看看我是否可以將狀態機拉出到基類,所以我不必將狀態機傳遞給輔助函數。如果我可以把狀態機放在一個基類中,我想我可以使用一組觸發器(這些是來自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);
現在,如果非常棒!非常感謝你! – jpiccolo 2012-04-03 20:14:49
這是他需要的一個很好的答案!但Enum並沒有給泛型提供任何強大的輸入和約束 - 你也可以使用對象並且不會有太大的區別。順便說一句。你應該將泛型限制在:struct至少(這是可能的)。 – NSGaga 2012-04-03 23:05:59
@NSGaga當然你是對的。我沒有添加任何約束,因爲他們似乎不必要;如果你使用了*不是*枚舉的類型,那麼基類中就沒有任何東西會被破壞。 Jon Skeet有一個名爲「無限制旋律」的項目,允許你通過重寫IL來應用枚舉約束--CLR支持枚舉約束,只有C#不支持。 – phoog 2012-04-04 14:39:02