2

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

在这一点上,我必须决定是否:

  • GraphicalMaze应该 extends MazeJPanel作为成员变量(继承)

或者

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

每次我必须从“抽象”对象创建“gui”对象时,都会出现这个问题。我对您的意见很感兴趣,我想了解什么是“正确”的进行方式。

4

4 回答 4

2

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

JComponent只有在要覆盖方法时才应该扩展 a 。否则,最好将其JComponent作为成员变量。

组合优于继承。

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

于 2013-01-18T19:48:47.240 回答
1

这不是最容易回答或最客观的问题。有些人倾向于说在大多数情况下你应该更喜欢组合而不是继承。我想说,想想你的对象以及它们之间的真正关系。在这种情况下,请记住继承表示is-a关系,而组合表示has-a

所以,问题变成, GraphicalMaze 是迷宫吗?还是迷宫的代表?我认为是后者。这当然意味着您将使用组合而不是继承来表示它。

于 2013-01-18T19:49:38.040 回答
0

我将您的GraphicalMaze对象视为显示迷宫的面板,并且我怀疑通过将其视为JPanel. 在这种情况下,我自己的解决方案是扩展JPanel但将新类称为MazePanel而不是GraphicalMaze.

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

于 2013-01-18T20:15:49.547 回答
0

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

于 2013-01-18T19:48:20.313 回答