在Java编写简单的老式Snake时,我终于找到了OOP中最大的困境。这对你来说肯定是微不足道的,但我很长时间都不能把这个问题用在文字上。
我的问题是关于对象之间的引用。在沟通对象时,什么是约定和良好做法?我的意思是,当然不是每个对象都应该知道它的创建者,例如,在我的情况下,我觉得没有其他方法可以相互沟通。例如:
我有MainMenu类,通过“新游戏”按钮控制简单表单。单击该按钮时,会创建一个Game对象(具有自己的表单),并且当新的Game对象的表单设置为visible时,MainMenu表单将设置为不可见。当游戏结束时,我想关闭游戏的形式并重新出现MainMenu形式。但是重新出现在Game对象中,所以必须有一个对这个MainMenu对象的引用,所以我将它传递给构造函数,但对我来说感觉不对,因为Game对象不应该知道MainMenu,它们是分开的东西,唯一的兴趣与MainMenu相关的游戏对象是让它在游戏结束后再次出现,并且感觉不足以进行额外的引用。
应该怎么做?我认为重新出现应该发生在MainMenu课程中,但我如何跟踪游戏结束呢?如何在专业编程中解决这类问题?
(抱歉我的英文)
答案 0 :(得分:0)
您可以创建GameFinishHandler
之类的界面,让MainMenu
实现它。 Game
类在游戏结束时调用所有已注册的处理程序。
interface GameFinishHandler {
void doAfterGameFinished();
}
class MainMenu implements GameFinishHandler {
...
private void createGame() {
this.game = new Game();
this.game.addHandler(this);
// ...
}
@Override
public void doAfterGameFinished() {
game.setVisible(false);
this.setVisible(true);
}
class Game {
private final List<GameFinishHandler> finishHandler = new ArrayList<>();
public void addHandler(GameFinishHandler handler) {
finishHandler.add(handler);
}
private void afterGameFinished() {
finishHandler.forEach(GameFinishHandler::doAfterGameFinished);
}
因此,您的Game
课程会提供您的菜单参考,但它并不“知道”它。它只包含任意数量的终结处理程序。