我有一個有趣的編程問題,讓我難倒了好幾天。有些情況下,幫助我的問題:有許多子類時的優雅代碼?
目前我正在寫一個使用材料Emum保持在遊戲中即Material.DIRT,Material.WATER,Material.CLOTH所需的所有材料遊戲...
不過,我希望儘可能使代碼可修改,並有能力讓某人想要擴展遊戲以添加新材料。因此,我當前的Enum系統崩潰了,所以我試圖切換到Class/Subclass系統。我找到了兩種方法來做到這一點,他們在下面解釋他們的優點和缺點。
案例1 - 具有抽象的Material類和子類。因此,每種材料都會擴展材質。這是有利的,因爲我們現在可以像材料一樣「分組」,即織物可以延伸材料,然後是羊毛和棉花等等。問題在於,對於每種材料都必須存在一個類,並且對於每種材料具有如此少的參數,這就像是浪費。如果有1000種材料,則會有1000個類別,而幾乎沒有任何內容。我可以通過匿名類來減少這種情況,但現在代碼無法區分一種材料和另一種材料。我可以使用一個身份證明系統,這是案例2的主要問題。
對於案例1的問題是: 有沒有更好的方法來做到這一點?案例2 - 具有單個Material類並將每個新材質實例化爲此類的一個實例,並使用不同的id /名稱定義每個材質。這節省了大量的書面材料,也使我們能夠區分材料。現在的問題是我們有一個身份證系統,我們該系統的基礎是什麼?字符串,整數?我問這個,因爲我總是渴望有一個複雜的免費系統,避免在代碼中使用硬編碼的字符串和整數。這就是爲什麼我喜歡枚舉,因爲不用擔心排版。另一個問題是,想要添加新材料的用戶可能與其他用戶有衝突的ID。
我對於案例2的問題是: 是否有一種能夠唯一且一致地區分實例的全面證明方法(每個運行時都相同)?
謝謝您的閱讀。任何幫助或方法如何最好地做到這一點將不勝感激。
編輯:我應該注意的是,一些材料可能有與之相關的方法和行爲。某些行爲對於某些材料可能是獨特的,某些行爲對於「組」也是相似的。
有一個'接口材料'需要返回,比如'String materialName()'。 'interface'還可以要求返回'Material' - 'getStrength()'等各種行爲。然後讓你的'enum'爲你的內部材料實現'interface'。其他人可以根據需要提供自己的實現。 –
我爲我自己的項目(元素和多個元素的組合子元素,用於元素RPG設置)與案例1一起使用。我嘗試枚舉和其他各種方法(接口等),但都沒有效果。下面是Elazar所說的另一種方法。 – Gorbles
對於您的編輯,我建議使用訪問者模式訪問您的材料屬性 - 這樣您就不必直接暴露行爲,並且可以利用多態性來切換行爲。這需要你使用'CASE 1'並隱藏「interface」後面的所有內容。使用訪問者模式,您不必在材料之間區分_因此不需要ID,只要它們覆蓋相關的「接受」方法以改變其行爲,就可以使用匿名類。 –