我目前正在尝试制作一个简单的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中并不存在。我只是以此为例来更好地解释它。我希望你理解我试图解释的内容,我确信这并不容易:/
答案 0 :(得分:3)
您可以尝试制作一个超级类来扩展另一个。然后您可以从两个类中获取方法!
答案 1 :(得分:3)
Java(和其他单一继承语言)的正确习惯用法是拥有两个接口。 EntityPlayer
和EntityCreature
然后将它们合并为一个Implements
每个接口的类。
另一种方法是使用Composite Pattern
创建一个具有每个Class
的所有方法的类,并让该类将每个方法委托给每个内部类的实例。组合接口的单个类。如果客户端代码不期望语言级别的接口或者像Python这样的鸭子类型语言,那么这就有效。
您可以将两个接口与Composite Pattern
结合使用,并将Composite
对象委托给每个Interface
的各个实现,这样可以轻松实现依赖注入;使用Google Guice之类的内容使您的代码更加灵活。