2009-12-16 107 views
3

我正在開發簡單棋盤遊戲等通用遊戲引擎。我定義了需要每個遊戲實現的接口,我有IGame,IGameState,IBoardEvaluator和IMove等類。如何分組泛型類?

我有像IGame.PerformMove(IMove移動),我想限制的方法。如果我玩井字遊戲,我想強制我只能使用具體的類TTTGame,TTTState,TTTMove等......

我可以想到幾種方法來做到這一點,但沒有一個聽起來有趣。也許所有的類都可以有一個通用參數,我可以確保它匹配。

so IGame<T> has method PerformMove(IMove<T> move) 

如果這樣做,我不知道用什麼類T也許沒關係。

我的另一個想法是在IGame上放上一堆泛型參數並給它所需的所有類。所以我會創建class TTTGame<TTTMove,TTTState,TTTMove....>

這也不是很好。是否有共同的模式來做到這一點?

+3

也許你正試圖想太多前期。你應該嘗試從一個簡單的遊戲實現開始,然後重構你的代碼使其更加通用。 – Costo 2009-12-16 05:54:49

回答

2

我沒有看到從指定您的TTTGame類只能使用TTTMoves得到的優勢。

我想你可能會在這裏工程。

通過這樣做,您唯一能夠保護自己的就是一些流氓MonopolyMove類變得自我意識並將自己置於您的代碼中。

我說堅持接口定義,避免泛型,除非你有一個真正有效的案例。我沒有看到一個基於你提到的。

+0

那麼這個想法是,如果我有一個TTTGame,我想能夠用TTTMove執行MoveMove(),並假設它是一個TTTMove,而不是一個壟斷移動。我寧願不必投射和檢查每種方法。 – captncraig 2009-12-16 06:00:17

+0

您不必檢查它是否是TTTMove。理想情況下,TTTMove從IMove繼承。如何移動的代碼我期望被聲明爲IMove :: Move(),並在TTTMove :: Move()中定義(使用重寫的方法)。 我不會嘗試編寫代碼,以防有人用MonopolyMove調用PerformMove(),因爲爲什麼任何代碼在TicTacToe遊戲中使用MonopolyMove? – santosc 2009-12-16 06:06:21

+0

也許你是對的。我試圖儘可能地強化它。我將不得不將它轉換爲TTTMove,如果失敗了,我會得到一個NullReference。讓我在那裏投擲壟斷。 – captncraig 2009-12-16 06:13:12

1

接口的要點是不關心類的具體實現。因此,我認爲沒有必要直接強制執行某個類,在這種情況下,可以通過類本身來進行論證。

TTTGame : IGame 
{ 
    PerformMove(TTTMove move); 
} 

也許這是你在說什麼。現在

public interface IGame<T> where T:IMove 
    { 
     void PerformMove(T move); 
    } 

public class TTTGame : IGame<TTTMove> 
    { 

     public void PerformMove(TTTMove move) 
     { 
      //perform move 
     } 

    } 

您的iGame被迫採取IMOVE,但像你一樣said..with多個類(IState..etc),這將導致混亂快捷。

+0

那麼重點是如果IGame接口指定了PerformMove需要一個IMove,那麼我可以給它任何類型的移動。您的版本不是IGame的有效實施。 – captncraig 2009-12-16 05:57:41

+0

更新了我的答案。 – 2009-12-16 06:14:27

1

我想說,你感覺需要限制你的接口到某些類的實現是一個接口不夠具體的指示。

IGame真的是個好主意嗎?這個名字表明它可能對tic-tac-toe和Quake同樣有效。當然,在不同的棋盤遊戲之間有一些相似之處(比如表演動作),但是你真的能從在這個高水平創建抽象中受益嗎?

+0

那麼這個想法是,我可以創建遊戲不可知論者,演示者和AI代理,可以玩任何符合界面的遊戲。目標是檢查多人回合制遊戲中的某些AI策略。 – captncraig 2009-12-17 17:12:34