0

可能重复:
从两个类扩展

我目前正在尝试为 Minecraft 制作一个简单的 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 作为参数,但新的 EntityAISwimming方法希望我使用 EntityCreature 的实例作为参数。所以我需要“扩展”EntityPlayer AND EntityCreature 并且不能只复制 EntityPlayer 并将其粘贴为 EntityModPlayer。

我已经玩过接口,但我认为这是不同的,所以我不能像“扩展”一样使用它。

对不起@所有不了解Minecraft或不懂我的英语的人......(我是德国人。)

有什么想法我不必更改许多/重要的类,如 EntityTasks(因为如果它们正在编辑同一个类,这会使我的 mod 与其他 mod 不兼容)?

*方法 new EntityFishHook (EntityPlayer) 在 Minecraft 中并不存在。我只是以此为例来更好地解释它。我希望您理解我试图解释的内容,我敢肯定这并不容易:/

4

2 回答 2

3

你可以尝试让你的一个超类来扩展另一个。然后你可以从两个类中获取方法!

于 2012-05-15T22:25:00.147 回答
3

Java(和其他单继承语言)的正确习惯用法是有两个接口。EntityPlayer然后EntityCreature你将它们组合成一个单独的类,Implements每个接口。

另一种方法是使用Composite Pattern创建单个类,该类具有每个类的所有方法,Class并让该类将每个方法委托给组合接口的单个​​类所拥有的每个内部类的实例。如果客户端代码不期望任何一个语言级别的接口或使用像 Python 这样的鸭子类型语言,则此方法有效。

您可以将这两种方法与两个接口结合起来,Composite Pattern并将Composite对象委托给每个接口的单独实现Interface,这样可以轻松进行依赖注入;使用 Google Guice 之类的工具使您的代码更加灵活。

于 2012-05-15T22:28:29.280 回答