[英]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.