java - 扩展多个类的替代方案

标签 java module minecraft

Possible Duplicate:
extending from two classes

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

(我不想编辑很多类,因为我希望我的 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 EntityCreature,而不能只复制 EntityPlayer 并将其粘贴为 EntityModPlayer。

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

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

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

*new EntityFishHook (EntityPlayer) 方法在 Minecraft 中并不存在。我只是用这个作为例子来更好地解释它。我希望你明白我试图解释的内容,我确信这并不容易:/

最佳答案

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

另一种方法是使用Composite Pattern创建一个类,该类包含每个Class中的所有方法,并让该类将每个方法委托(delegate)给组合接口(interface)的单个​​类所拥有的每个内部类。如果客户端代码不需要语言级别的接口(interface)或使用鸭子类型语言(如 Python),则此方法有效。

您可以将这两种方法与Composite Pattern结合起来,并将Composite对象委托(delegate)给每个Interface的单独实现,这将启用简单的依赖注入(inject);使用 Google Guice 等工具使您的代码更加灵活。

关于java - 扩展多个类的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10609589/

相关文章:

java - 如何使用 Java DOM 解析器读取 XML 字符串?民意调查、结果

java - Java中简单递归的错误

java - 在不使用数据库的情况下用 Java 创建报告

javascript - 如何正确访问模块内的类属性和函数

jsch1.4.8的Java Telnet Applet无法输入

module - 通过命令行参数选择要使用的 ocaml 模块

Java源代码依赖关系图

lua - 窗口 :94:arguments must be the same length stand for? 是什么意思

java - 为什么在使用 proguard 混淆时调用不起作用

Java/Minecraft - 如何读取/理解数据包