gui对象的继承或组合

时间:2013-01-18 19:38:37

标签: java inheritance composition

我正在开发一款简单的游戏。我创建了一个Maze类,其中包含用于创建/修改/解决迷宫的方法和算法。我还创建了一个GraphicalMaze类,它应该只包含一个paint方法来在JPanel上绘制迷宫。

此时,我必须决定是否:

  • GraphicalMaze应扩展MazeJPanel作为成员变量(继承)

  • GraphicalMaze应扩展JPanelMaze作为成员变量(合成)

每次我必须从'abstract'创建'gui'对象时,这个问题就会重现。 我对你的意见感兴趣,我想知道什么是'正确'的方式。

4 个答案:

答案 0 :(得分:2)

如果GraphicalMaze存在的唯一原因是绘制Maze,则该方法应包含在Maze类中。我通常会调用方法draw,但paint可以正常工作。

如果要覆盖方法,则只应扩展JComponent。否则,最好将JComponent作为成员变量。

继承的构成。

在您的特定情况下,我会延长JPanel并覆盖paintComponent方法,以调用paint类的Maze方法。您必须将Maze类的实例传递给扩展的JPanel类。

答案 1 :(得分:1)

这不是最简单或最客观的问题。在大多数情况下,有些人倾向于说你应该赞成合成而非继承。我会说,考虑一下你的对象以及它们 真正 如何相互关联。在这种情况下,请记住,继承表示 is-a 关系,而composition表示 has -a

那么,问题就变成了,是一个 GraphicalMaze一个迷宫?或者它是迷宫的表示?我会争辩后者。这当然意味着您将使用合成而不是继承来表示它。

答案 2 :(得分:0)

我会选择第二个选项。原因是GraphicalMaze是一个修改显示但是Maze包含要显示的数据的类,因此GraphicalMaze应该与图形有更紧密的“连接”。

答案 3 :(得分:0)

我认为您的GraphicalMaze对象是一个显示迷宫的面板,我怀疑通过将其视为JPanel的子类将其放入图形应用程序会更容易。在这种情况下,我自己的解决方案是扩展JPanel但是将新类称为MazePanel而不是GraphicalMaze

话虽如此,如果你经常面对这个问题,那么尝试以两种方式实现它并且看哪一个引导你到一个更容易使用的应用程序结构可能是值得的。