扩展多个类的替代方法

时间:2012-05-15 22:17:35

标签: java module minecraft

  

可能重复:
  extending from two classes

我目前正在尝试制作一个简单的Mod for Minecraft,我基本上需要这个代码:

(我不想编辑很多类,因为我希望我的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作为参数,但新的EntityAISwimming 方法要求我使用EntityCreature的实例作为参数。所以我需要“扩展”EntityPlayer AND EntityCreature,不能只复制EntityPlayer并将其粘贴为EntityModPlayer。

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

对不起@每个不懂Minecraft或者不懂英语的人......(我是德国人。)

我不需要更改许多/重要的类,如EntityTasks(因为如果他们编辑同一个类,这会使我的mod与其他mod不兼容)的任何想法?

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

2 个答案:

答案 0 :(得分:3)

您可以尝试制作一个超级类来扩展另一个。然后您可以从两个类中获取方法!

答案 1 :(得分:3)

Java(和其他单一继承语言)的正确习惯用法是拥有两个接口。 EntityPlayerEntityCreature然后将它们合并为一个Implements每个接口的类。

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

您可以将两个接口与Composite Pattern结合使用,并将Composite对象委托给每个Interface的各个实现,这样可以轻松实现依赖注入;使用Google Guice之类的内容使您的代码更加灵活。