さまざまなコンポーネントによって拡張される有限状態マシンを表す基本クラスを作成したいと思います。可能な限り汎用的で、そのマシン専用に設計された状態のみを実行できるようにする必要があります。これは私がこれまでに得たものです:
public interface IState<out T> where T : FiniteStateMachine {
void Enter( T p );
void Execute( T p );
void Exit( T p );
}
public class FiniteStateMachine {
public IState<FiniteStateMachine> CurrentState { get; private set; }
public void ChangeState( IState<FiniteStateMachine> s ) {
if ( CurrentState != null )
CurrentState.Exit( this );
CurrentState = s;
s.Enter( this );
}
}
public class Car : FiniteStateMachine { }
public class Boat : FiniteStateMachine { }
public class CarState : IState<Car> {
public void Entra( Car f ) { }
public void Esegui( Car f ) { }
public void Esci( Car f ) { }
}
public class BoatState : IState<Boat> {
public void Enter( Boat f ) { }
public void Execute( Boat f ) { }
public void Exit( Boat f ) { }
}
そして、ここに小さなサンプルがあります:
var car = new Car( );
var boat = new Boat( );
// These are fine
car.ChangeState( new CarState( ) );
boat.ChangeState( new BoatState( ) );
// These aren't
car.ChangeState( new BoatState( ) );
boat.ChangeState( new CarState( ) );
基本的には、Car.ChangeState
実装している州だけを受け入れIState<Car>
たい、受け入れたいBoat.ChangeState
だけIState<Boat>
、などです。
私はそのような行動を達成することはできませんが、誰かが私を助けることができますか?