gpt4 book ai didi

java - OOP 设计 : How to decide program flow and class responsible for method (JSFML library)

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:06:35 25 4
gpt4 key购买 nike

我正在设计一个 2D 游戏来练习 Java 和面向对象编程(我正在使用 JSFML 库,如果这有帮助的话),我对如何最好地设计以下内容有疑问:

我正在使用的库提供了一个由可见游戏元素(玩家、敌人、背景等)实现的Drawable 界面。我还有一个 RenderWindow,我将在其上绘制 Drawable 对象。

事情是这样的,RenderWindow 有一个 draw(Drawable d) 方法,它在当前窗口上绘制一个 Drawable 对象,并且Drawable 对象有一个 draw(RenderWindow r) 方法,它在传递的 RenderWindow 上绘制当前的 Drawable 对象。

如果它们基本上做同样的事情,我应该使用哪一个?为什么?我应该考虑什么来决定?我使用 HashMap 来存储 Drawable 对象。是将RenderWindow传递给HashMap中的Drawables,还是将HashMap中的Drawables传递给RenderWindow?任何建议表示赞赏。

最佳答案

您问题的一个简单答案是
Java 语言不支持双重分派(dispatch)机制。

要做什么:库希望您覆盖这些方法但永远不要调用它们。我没有使用过该库,但根据游戏引擎的一些经验,我猜应用程序将调用 RenderWindow 的绘制,并且最终将调用所有 Drawable 的绘制方法。 (Drawables 的集合将由 RenderWindow 维护。

原因:Java 通过检查调用方法的对象类(而不是检查引用)来动态调用方法。这称为(您可能知道)动态分派(dispatch)。
但是方法的参数是通过仅检查引用来选择的(而不是通过作为参数传递的实际对象的类。)
在这里,通过强制动态分派(dispatch)两次(通过为同一目的制作两种方法),库开发人员间接实现了双重分派(dispatch)。

将来,您可能希望同时扩展 Drawable 和 RenderWindow。如果你只在 Drawable 中有 draw 方法,你就不能为 RenderWindow 的每个 child 单独绘制。双重调度解决了这个问题。

希望这会有所帮助。

关于java - OOP 设计 : How to decide program flow and class responsible for method (JSFML library),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20687360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com