using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FiniteStateMachine.Core { interface IState { void Entry(); void Exit(); void Do(); } public abstract class StateBase : IState { private readonly StateContext SC; public StateBase(StateContext sC) { SC = sC; } public virtual void Do() { Trace.WriteLine("StateBase : Do"); Trace.WriteLine("StateBase : DataFromServer"); Trace.WriteLine("StateBase : CheckIsMarkingpossible"); } public virtual void Entry() { Trace.WriteLine("StateBase : Entry"); } public virtual void Exit() { Trace.WriteLine("StateBase : Exit"); } } public class State1 : StateBase { public State1(StateContext sC) : base(sC) { } public override void Do() { base.Do(); Trace.WriteLine("State 1: Do"); Trace.WriteLine("State 1: DataFromServer"); Trace.WriteLine("State 1: CheckIsMarkingpossible"); Trace.WriteLine("State 1: ServerData1 and ServerData2 are available!"); } public override void Entry() { base.Entry(); Trace.WriteLine("State 1: Entry"); } public override void Exit() { base.Exit(); Trace.WriteLine("State 1: Exit"); } } public class State2 : StateBase { public State2(StateContext sC) : base(sC) { } public override void Do() { base.Do(); Trace.WriteLine("State 2: Do"); Trace.WriteLine("State 2: Marking Ink"); } public override void Entry() { base.Entry(); Trace.WriteLine("State 2: Entry"); } public override void Exit() { base.Exit(); Trace.WriteLine("State 2: Exit"); } } public class State3 : StateBase { public State3(StateContext sC) : base(sC) { } public override void Do() { Trace.WriteLine("State 3: Do"); Trace.WriteLine("State 3: Send result to server"); } public override void Entry() { Trace.WriteLine("State 3: Entry"); } public override void Exit() { Trace.WriteLine("State 3: Exit"); } } }