2014-02-12 44 views
0

我有一個有趣的編程問題,讓我難倒了好幾天。有些情況下,幫助我的問題:有許多子類時的優雅代碼?

目前我正在寫一個使用材料Emum保持在遊戲中即Material.DIRT,Material.WATER,Material.CLOTH所需的所有材料遊戲...

不過,我希望儘可能使代碼可修改,並有能力讓某人想要擴展遊戲以添加新材料。因此,我當前的Enum系統崩潰了,所以我試圖切換到Class/Subclass系統。我找到了兩種方法來做到這一點,他們在下面解釋他們的優點和缺點。

案例1 - 具有抽象的Material類和子類。因此,每種材料都會擴展材質。這是有利的,因爲我們現在可以像材料一樣「分組」,即織物可以延伸材料,然後是羊毛和棉花等等。問題在於,對於每種材料都必須存在一個類,並且對於每種材料具有如此少的參數,這就像是浪費。如果有1000種材料,則會有1000個類別,而幾乎沒有任何內容。我可以通過匿名類來減少這種情況,但現在代碼無法區分一種材料和另一種材料。我可以使用一個身份證明系統,這是案例2的主要問題。

對於案例1的問題是: 有沒有更好的方法來做到這一點?案例2 - 具有單個Material類並將每個新材質實例化爲此類的一個實例,並使用不同的id /名稱定義每個材質。這節省了大量的書面材料,也使我們能夠區分材料。現在的問題是我們有一個身份證系統,我們該系統的基礎是什麼?字符串,整數?我問這個,因爲我總是渴望有一個複雜的免費系統,避免在代碼中使用硬編碼的字符串和整數。這就是爲什麼我喜歡枚舉,因爲不用擔心排版。另一個問題是,想要添加新材料的用戶可能與其他用戶有衝突的ID。

我對於案例2的問題是: 是否有一種能夠唯一且一致地區分實例的全面證明方法(每個運行時都相同)?

謝謝您的閱讀。任何幫助或方法如何最好地做到這一點將不勝感激。

編輯:我應該注意的是,一些材料可能有與之相關的方法和行爲。某些行爲對於某些材料可能是獨特的,某些行爲對於「組」也是相似的。

+1

有一個'接口材料'需要返回,比如'String materialName()'。 'interface'還可以要求返回'Material' - 'getStrength()'等各種行爲。然後讓你的'enum'爲你的內部材料實現'interface'。其他人可以根據需要提供自己的實現。 –

+1

我爲我自己的項目(元素和多個元素的組合子元素,用於元素RPG設置)與案例1一起使用。我嘗試枚舉和其他各種方法(接口等),但都沒有效果。下面是Elazar所說的另一種方法。 – Gorbles

+0

對於您的編輯,我建議使用訪問者模式訪問您的材料屬性 - 這樣您就不必直接暴露行爲,並且可以利用多態性來切換行爲。這需要你使用'CASE 1'並隱藏「interface」後面的所有內容。使用訪問者模式,您不必在材料之間區分_因此不需要ID,只要它們覆蓋相關的「接受」方法以改變其行爲,就可以使用匿名類。 –

回答

2

使用一個配置文件,其中包含所有的材料,用一些DSL(簡單的表格,基本上)編寫。

+1

我認爲不同的材料可能會有不同的_behaviours_,這是多態性出現的地方。如果是這種情況,那麼這個解決方案實施起來會很棘手(Drules?)。 –

+0

這取決於實現,但我相信遊戲中的材料等簡單事物的行爲可以很容易地編碼在表格中。 – Elazar

+1

同意,你得到我的+1。但是,如果OP想要某種訪問者模式(這是有道理的 - 比如說一件衣服是由多種材料構成的,並且會被切割或者是某種類型的),那麼這會變得很麻煩。 –