0
public abstract class State<T>
{
    public virtual Enter(T item)
    {
            // an empty method
    }
}

public class ChaseState : State<FieldPlayer>
{
    public override Enter(Player pl)
    {
        // ...
        pl.Fsm.CurrentState = ChaseState.Instance;
        //...
    }
}

public class TendGoal : State<Goalkeeper>
{
   public override Enter(Goalkeeper gk)
   {
       // ...implementation
       gk.Fsm.CurrentState = TendGoal.Instance;
       // ...implementation
   }
}

public class DefendState : State<Team>
{
    public override Enter(Team team)
    {
        // ....    
        team.Fsm.CurrentState = DefendState.Instance;
        //.....
    }
}

「ゴールキーパー」と「フィールドプレーヤー」は抽象クラス「プレーヤー」を継承し、「チーム」は別のクラスを継承します。

public class FSM
{
    public /*some type*/ owner;         // PROBLEM 1
                                        // OWNER CAN BE TEAM, GOALKEEPEEPER
                                        // OR FIELD PLAYER
    public /*some type*/ globalState;
    public /*some type*/ currentState;
    public /*some type*/ previousState;
    public void Update()
    {
        if (globalState != null)
        {
            globalState.Execute(owner);  // PROBLEM 2
                                         // IF GLOBAL STATE'S TYPE
                                         // IS AN OBJECT, CANT CALL EXECUTE
                                         // OBJECTS TYPE WILL BE KNOWN ONLY
                                         // DURING RUNTIME
        }
     }
}

タイプ「Goalkeeper」、「FieldPlayer」、および「Team」の各オブジェクトには、ステートマシンインスタンスがあります。問題は..ジェネリックはプロパティではありえないということです。

私は何をすべきか ?

4

2 に答える 2

0

コードをもう少し読んだ後、ここでは抽象クラスは不要です。Stateをインターフェース(例:IState)に変換し、そこから一般的な署名を削除する必要があります。次に、FSMオブジェクトのプロパティをすべてpublicIStateglobalStateなどにすることができます。

于 2013-03-25T15:19:33.057 に答える
0

Stateを汎用ではなく通常のインターフェイスにし、Enterメソッドに、チーム、ゴールキーパー、プレーヤーなどがすべて実装する別のインターフェイスを使用させる場合(空の場合もあります)、機能するはずです。

public interface IOwner {}

public interface IState
{
    void Enter(IOwner item);
}
public class ChaseState : IState
{
    public void Enter(IOwner pl)
    {
        // ...
        //...
    }
}
public class Player :IOwner { }
public class Something {
    IOwner owner = new Team();
    IState globalState = new ChaseState();
    IState currentState = new DefendState();

    public void Update()
    {
        if (globalState != null)
        {
            globalState.Enter(owner); 
        }
        else if (currentState != null)
        {
            currentState.Enter(owner);
        }
     }
}
于 2013-03-25T15:35:41.247 に答える