0

さまざまなコンポーネントによって拡張される有限状態マシンを表す基本クラスを作成したいと思います。可能な限り汎用的で、そのマシン専用に設計された状態のみを実行できるようにする必要があります。これは私がこれまでに得たものです:

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>、などです。

私はそのような行動を達成することはできませんが、誰かが私を助けることができますか?

4

1 に答える 1

6

基本的に、 Car.ChangeState が を実装する状態のみを受け入れ、のみを受け入れるようにしたいと考えてIState<Car>Boat.ChangeStateますIState<Boat>

これを行う典型的な方法は、Curiously Recurring Template パターンのバリエーションを使用することです。ここでパターンの C# バージョンについて説明します。

http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx

これを追求しないことをお勧めします。このパターンはコードを理解しにくくし、実際に行う制限は、必要な制限ではありません。型システムは、必要な種類の制約を表すのが得意ではありません。型システムは、すべての人にとってすべてのものになることはできません。

于 2013-06-24T17:15:34.277 に答える