所以我試圖做一個簡單的RPG般的基於文本的遊戲來鞏固我的一些研究,我想知道如何最好的方式來實現這種類型的設置是:類層次結構和設置
接口稱爲戰鬥機>由AbstractFighter實施> MagicFighter和StrengthFighter擴展AbstractFighter。 (原本MagicFighter和StrengthFighter有自己的接口,具有額外的獨特行爲),但...
現在,令人困惑的是我希望玩家能夠在這兩種戰鬥機之間進行選擇,然後將其存儲在列表(戰鬥機)。所以很顯然,我得到的類型總是戰鬥機(它必須是因爲我不知道用戶將選擇哪種戰鬥機的實現),我只能調用在戰鬥機接口中的方法。我可以做的一件事是每次我需要調用不同Fighter實現所特有的方法時,爲玩家選擇和下注而寫入檢查。但是這意味着很多重複的代碼,並且聽起來很亂= /。
另一種可能性是運行檢查並根據用戶的選擇將用戶添加到列表(StengthFighter)或列表(MagicFighter),但最終這與前面的「解決方案」具有完全相同的問題。
我能想到的最後一件事就是嘗試和反映Fighter的每個實現,以便每個行爲都有一個版本。因此,例如 void regen();在戰鬥機界面中,然後對StrengthFighter和MagicFighter採用不同的方式(魔法戰士可以恢復法力值,力量戰士可能會在他使用攻擊時恢復憤怒()(這是由於ManaFighter需要實施regen() ,但內StrengthFighter使用,這將是私人)
不管怎麼說,你現在可能已經得到的要點,所以金正日節省更多textwalling
沸騰什麼下來;這是一大敗筆我或者這僅僅是面向對象編程的必然性呢?我的意思是,在一天結束時,如果Java要求用戶做出決定,Java如何知道結果需要的類型(以及因此使用它的方法)確定類型
Make Fighter有一個公共職業,作爲樣板戰鬥機,並擴展/重寫MagicFighter和StrengthFighter特定的方法。另一種選擇是隻讓一個基於枚舉類型處理所有事情的Fighter類。對面向對象很好,但是當它像你提交時一樣令人困惑的時候,可以減少一些複雜性並保持簡單。 – Compass 2014-12-01 21:36:36
當用戶選擇他的類型時,只需調用新的MagicFighter(),然後它自然會調用特定的方法? – realUser404 2014-12-01 21:40:35