2012-05-15 173 views
0

可能重複:
extending from two classes替代擴展多個類

我正在試圖讓我的世界爲一個簡單的調製和我基本上都需要這樣的代碼:

(我不想編輯很多類,因爲我希望我的mod可以和其他很多mod兼容。)

public class EntityModPlayer extends EntityPlayer, EntityCreature 
{ 
    super(par1World); 
    fishHook = new EntityFishHook(this /* has to be EntityPlayer */); 
    tasks.addTask(0, new EntityAISwimming(this /* has to be EntityCreature */)); 
} 

但是你不能擴展多個類...

新EntityFishHook *想要一個EntityPlayer而不是EntityModPlayer作爲PARAM但新EntityAISwimming方法要我用一個實例EntityCreature作爲參數。所以我需要「擴展」EntityPlayer EntityCreature,不能只複製EntityPlayer並將其粘貼爲EntityModPlayer。

我已經玩過接口,但我認爲這是不同的,所以我不能像「擴展」一樣使用它。

對不起@大家誰不知道我的世界還是無法理解我的英語...(我是德國人。)

任何想法,我沒有改變多/重要類像EntityTasks(因爲如果他們正在編輯同一個類,這會使我的mod與其他mods不兼容)?

*新的EntityFishHook(EntityPlayer)方法在Minecraft中並不存在。我只是以此爲例來更好地解釋它。我希望你明白我想解釋的是什麼,我敢肯定這不是一件容易的事情:/

+0

只需製作EntityPlayer和EntityCreature類型的實例變量,並將它們傳遞給構造函數。 – eboix

回答

3

Java(和其他單一繼承語言)的正確用法是有兩個接口。 EntityPlayerEntityCreature然後將它們組合成單個類,即Implements的每個接口。

另一種方法是使用Composite Pattern創建具有全部來自各Class方法單一類和有類代表每個方法給每個通過結合接口的單一類擁有的內部類的實例。如果客戶端代碼不期望在語言級別的接口或者像Python這樣的鴨子打字語言,那麼這是有效的。

您可以結合兩者同Composite Pattern接近兩個接口,並有Composite對象委託給每個Interface的個別實現,這將使容易依賴注入;使用Google Guice之類的代碼使您的代碼更加靈活。

+0

謝謝!作品! :) – user1363904

3

你可以嘗試讓你的一個超類擴展另一個類。然後你可以從兩個類中獲得方法!