如何在Java

时间:2017-11-19 04:23:56

标签: java arrays generics inheritance

我正在练习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[][],但ChessBoardsChessSquare[][]

https://stackoverflow.com/a/18111163/8611351显示了如何创建数组,但无法动态获取泛型的类。必须将类传递给构造函数,这会给实现者增加不必要的复杂性。

关于类似模式的问题的一些答案建议让GameBoard的子类用自己的方块填充数组,然后每次读取板时都进行转换。这是可接受的做法吗?何时投射并instanceof被认为是可接受的设计?

board不需要在抽象类中定义,Orthogonal中的所有方法都可以依赖于具体的实现。但这听起来像是将重复代码放入每个不同游戏的好方法。

我可以完全删除Orthogonal类,并将用于导航电路板的逻辑放入GridBoard。但是,如果我这样做,就不会像return square.neighbors().filter(MineSquare::isBomb).count()这样写一些东西。

我可以将类定义更改为GridBoard <E>,并使Orthogonals成为根据需要创建的类,并从板上读取E。这似乎是最合理的解决方案,但我非常好奇解决子类问题数组的最佳方法,如果这不是一个选项。我忽略了一个好处或缺点吗?

0 个答案:

没有答案