2013-03-25 84 views
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; 
     //..... 
    } 
} 

「守門員」和「FieldPlayer」繼承自抽象類「Player」,而「Team」繼承自另一個類。C#存儲泛型狀態

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 
     } 
    } 
} 

「守門員」,「FieldPlayer」和「Team」類型的每個對象都有一個狀態機實例。問題是...泛型不能成爲屬性。

我該怎麼辦?

+0

我應該改變整個設計,如果是的話,怎麼樣? – Orvel 2013-03-25 15:12:12

+0

它看起來不像你的抽象類需要是通用的。您可以使抽象類只是一個普通的對象,並在每個對象中實現該抽象類。然後,您可以將狀態類型屬性添加到您的FSM類。在閱讀更多內容之後,您實際上需要將State設置爲一個普通的Interface,因爲您在抽象類中沒有做基礎工作。 – 2013-03-25 15:15:24

+0

@CalebKeith我將如何覆蓋具有不同參數的虛擬方法? – Orvel 2013-03-25 15:18:30

回答

0

如果你使狀態成爲一個普通的接口,而不是通用的,並且讓它的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); 
     } 
    } 
} 
0

在閱讀你的代碼之後,抽象類在這裏是不必要的。您應該將狀態轉換爲接口,例如:IState,並從中刪除通用簽名。然後你的FSM對象中的屬性都可以是公開的IState全局狀態等。