我正在练习Java,通过制作可以玩一些在线益智游戏的程序,如扫雷,国际象棋等。由于游戏都是在正交网格上进行的,我找到了每种游戏共有的方法并将它们扔进去我有一个名为Orthogonals的二维元素数组的类。我的第一个直觉是让董事会的方块一般打字:
public abstract class GridBoard <E extends Orthogonal>{
private final E[][] board;
public final int width;
public final int height;
public GridBoard(int width, int height){
this.width=width;
this.height=height;
board= new E[][]();
}
/*...*/
}
不幸的是,由于某些重要原因,new E[][]()
是不可能的。我会很高兴使用像public GridBoard(E[][] board)
这样的构造函数,但我希望Orthogonal
拥有像orthogonal.getNeighbor(NORTH)
这样的方法,这些方法要求他们知道哪个(final
)他们是一个部分。从我所知道的,有几种不同的方法可以解决这个限制,但没有一种方法可以简化设计。我的目标是让MinesweeperBoard
使用MineSquare[][]
,但ChessBoards
有ChessSquare[][]
。
https://stackoverflow.com/a/18111163/8611351显示了如何创建数组,但无法动态获取泛型的类。必须将类传递给构造函数,这会给实现者增加不必要的复杂性。
关于类似模式的问题的一些答案建议让GameBoard
的子类用自己的方块填充数组,然后每次读取板时都进行转换。这是可接受的做法吗?何时投射并instanceof
被认为是可接受的设计?
board
不需要在抽象类中定义,Orthogonal
中的所有方法都可以依赖于具体的实现。但这听起来像是将重复代码放入每个不同游戏的好方法。
我可以完全删除Orthogonal
类,并将用于导航电路板的逻辑放入GridBoard
。但是,如果我这样做,就不会像return square.neighbors().filter(MineSquare::isBomb).count()
这样写一些东西。
我可以将类定义更改为GridBoard <E>
,并使Orthogonals成为根据需要创建的类,并从板上读取E
。这似乎是最合理的解决方案,但我非常好奇解决子类问题数组的最佳方法,如果这不是一个选项。我忽略了一个好处或缺点吗?