我正在开发一款简单的游戏。我创建了一个Maze
类,其中包含用于创建/修改/解决迷宫的方法和算法。我还创建了一个GraphicalMaze
类,它应该只包含一个paint
方法来在JPanel
上绘制迷宫。
此时,我必须决定是否:
GraphicalMaze
应扩展Maze
,JPanel
作为成员变量(继承)或
GraphicalMaze
应扩展JPanel
,Maze
作为成员变量(合成)每次我必须从'abstract'创建'gui'对象时,这个问题就会重现。 我对你的意见感兴趣,我想知道什么是'正确'的方式。
答案 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
。
话虽如此,如果你经常面对这个问题,那么尝试以两种方式实现它并且看哪一个引导你到一个更容易使用的应用程序结构可能是值得的。