2011-03-05 49 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语言)返回类型是'最低公分母'类。方法可以返回该类的对象(或实现该接口的对象)或返回类型的子类。