[英]Java OOP : How to design the situation where an attribute value would decide the class of another attribute?
[英]OOP design: How to decide program flow and class responsible for method (JSFML library)
我正在设计一个2D游戏来练习Java和面向对象编程(我正在使用JSFML库,如果有帮助的话),我对如何最好地设计以下内容表示怀疑:
我正在使用的库提供了由可见游戏元素(玩家,敌人,背景等)实现的Drawable
界面。 我还有一个RenderWindow
,我将在其上绘制Drawable
对象。
这里的东西,在RenderWindow
有draw(Drawable d)
绘制的方法Drawable
在当前窗口对象,并且Drawable
对象都有一个draw(RenderWindow r)
绘制当前方法Drawable
的对象RenderWindow
传递。
如果他们做的基本相同,我应该使用哪一个? 为什么? 我应该考虑什么来决定? 我使用HashMap存储Drawable
对象。 我应该通过RenderWindow
到Drawables
在HashMap中或通过Drawables
在HashMap中的RenderWindow
? 任何建议表示赞赏。
对你的问题的一行答案是
Java语言不支持双调度机制。
怎么做:库希望您覆盖这些方法,但绝不会调用它们。 我没有使用过这个库,但是从游戏引擎的一些经验来看,我猜应用程序会调用RenderWindow的绘图,它最终会调用所有Drawable的绘制方法。 (Drawables的收集将由RenderWindow维护。
原因: Java通过检查调用该方法的对象类(而不是通过检查引用)来动态调用该方法。 这被称为(您可能知道)动态调度。
但是方法的参数是通过仅检查引用(而不是通过作为参数传递的实际对象的类)来选择的。
在这里,通过强制动态调度两次(通过使两个方法用于相同目的),库开发人员间接实现了双重调度。
将来,您可能希望扩展Drawable和RenderWindow。 如果只有Drawable中的draw方法,则不能为RenderWindow的每个子项单独绘制。 双重调度解决了这个问题。
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.