2011-03-05 41 views
1

真的有必要使用'擴展BoardGame'嗎?這是否適用於仿製藥?

如果我刪除我的代碼仍然有效,但我不知道我是否應該。

我這樣做是因爲複製()方法。

有任何建議。

感謝

public interface BoardGame<GAME extends BoardGame> 
{ 
    GAME getGame(); 

    BoardGame<GAME> copy(); 

    int currentPlayer(); 

    boolean isGameOver(); 

    int getTotalMoves(); 

    BoardResult getOutcome(int playerIndex); 

    void makeMove(int moveIndex); 

    void addMoveObserver(BoardGameMoveObserver observer); 
} 

回答

2

這兩個都可以,因爲他們編譯好。

如果使用<GAME extends BoardGame>比一切的實現都需要使用擴展桌上游戲類型參數。這是有道理的,如果任何方法接受參數或返回值是GAME。

在你的情況是getGame()。所以在<GAME extends BoardGame>的情況下,getGame()的所有用戶都可以計算返回值是(至少)BoardGame。但在這種情況下,getGame()可能返回任何類型的實現類定義..

+0

需要指出的是,在這種情況下,泛型不會爲您提供任何幫助。如果您希望從複製方法中獲得子類型的好處,則必須具有對該子類型的變量的引用。你可以做到這一點沒有泛型,你的代碼更乾淨。 – AndyT 2011-03-06 09:45:22

+0

不完全。隨着泛型實現'getGame()'必須返回'GAME',沒有泛型'BoardGame'就足夠了。 – 2011-03-06 14:07:51

+0

好點,雖然我認爲增加的複雜程度很容易抵消強制返回類型的邊際收益。一個實現BoardGame的類將會爲這個方法返回一個不同的實現類(並且Javadoc應該使預期的行爲清晰)。 – AndyT 2011-03-06 17:34:48

2

不應該copy()返回類型是GAME

泛型是從來沒有 「必要的」。我們沒有它住了十年,這很好。

當仿製藥創造太多的複雜性,它可以移除一些。在你的情況下,如果它不是通用的,你總是可以記錄copy()應該返回一個特定的類型,並且調用者總是可以手動將返回的對象轉換爲特定的類型。這可能比添加此類型參數更簡單,只是爲了獲得一點收益。

P.S.它應該是,要嚴格,

public interface BoardGame<GAME extends BoardGame<GAME> > 
+0

+1在嚴格說明。 – 2011-03-05 11:02:05

+0

是的,getGame返回'this',我將其用於特定棋盤遊戲的評估函數,該遊戲應該可以訪問實際的棋盤遊戲。 – 2011-03-05 11:03:41

+0

事情是,我有幾個遊戲,井字遊戲,奧賽羅,跳棋等這個一般的棋盤遊戲界面。我有這些遊戲的基本算法,與alpha beta修剪,隨機球員,蒙特卡羅樹搜索minimax,等等。這些算法利用了所有的方法,除getGame()之外。問題在於這些算法使用EvaluationFunction(接口),這是遊戲特定的,這就是爲什麼我使用getGame(),因此遊戲的具體評估函數可以訪問實際的板子。 – 2011-03-05 11:09:49

1

如果複製方法返回實現BoardGame的對象,則不必使用泛型 - 它隱含在接口定義(和一般的java語言)返回類型是'最低公分母'類。方法可以返回該類的對象(或實現該接口的對象)或返回類型的子類。