我正在设计一个2D游戏来练习Java和面向对象编程(我正在使用JSFML库,如果有帮助的话),我对如何最好地设计以下内容表示怀疑:
我正在使用的库提供了由可见游戏元素(玩家,敌人,背景等)实现的Drawable
界面。我还有RenderWindow
,我将在其上绘制Drawable
个对象。
就是这样,RenderWindow
有draw(Drawable d)
方法在当前窗口上绘制Drawable
对象,Drawable
个对象有draw(RenderWindow r)
个对象通过Drawable
绘制当前RenderWindow
对象的方法。
如果他们做的基本相同,我应该使用哪一个?为什么?我应该考虑什么来决定?我使用HashMap存储Drawable
个对象。我应该将RenderWindow
传递给HashMap中的Drawables
,还是将HashMap中的Drawables
传递给RenderWindow
?任何建议都表示赞赏。
答案 0 :(得分:1)
您问题的一行答案是 Java语言不支持双重调度机制。
该怎么做:库希望您覆盖这些方法,但绝不会调用它们。我没有使用过这个库,但是从游戏引擎的一些经验来看,我猜应用程序会调用RenderWindow的绘图,它最终会调用所有Drawable的绘制方法。 (Drawables的收集将由RenderWindow维护。
为什么: Java通过检查调用方法的对象类(而不是通过检查引用)来动态调用该方法。这被称为(你可能知道)动态调度。
但是方法的参数只能通过检查引用来选择(不是通过作为参数传递的实际对象的类。)
这里,通过强制动态调度两次(通过使两个方法用于相同目的),库开发人员间接实现了双重调度。
将来,您可能希望扩展Drawable和RenderWindow。如果只有Drawable中的draw方法,则不能为RenderWindow的每个子项单独绘制。双重调度解决了这个问题。
希望这会有所帮助。