0

重複の可能性:
2 つのクラスからの拡張

現在、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*は、EntityModPlayer ではなく EntityPlayer をパラメーターとして必要としますが、新しい EntityAISwimmingメソッドは、EntityCreature のインスタンスをパラメーターとして使用することを望んでいます。したがって、EntityPlayer とEntityCreatureを「拡張」する必要があり、EntityPlayer を単にコピーして EntityModPlayer として貼り付けることはできません。

私はすでにインターフェースで遊んでいましたが、これは何か違うと思うので、「拡張」のようには使えません。

@ マインクラフトを知らない人、または私の英語が理解できない人はごめんなさい... (私はドイツ人です。)

EntityTasks のような多く/重要なクラスを変更する必要がないアイデアはありますか (同じクラスを編集している場合、他の mod と互換性がなくなるため)?

※メソッド new EntityFishHook (EntityPlayer) はマインクラフトには実在しません。よりよく説明するために、これを例として使用しました。私が説明しようとしたことを理解していただければ幸いです。簡単ではないことは確かです :/

4

2 に答える 2

3

スーパークラスの1つを作成して、もう1つを拡張することができます。その後、両方のクラスのメソッドにアクセスできます。

于 2012-05-15T22:25:00.147 に答える
3

Java (およびその他の単一継承言語) の正しいイディオムは、2 つのインターフェースを持つことです。EntityPlayerそして、それらを組み合わせて、それぞれがインターフェースEntityCreatureを持つ単一のクラスにします。Implements

もう 1 つの方法は、 を使用してComposite Pattern、それぞれのすべてのメソッドを持つ単一のクラスを作成し、Classそのクラスから各メソッドを、インターフェイスを結合する単一のクラスが所有する各内部クラスのインスタンスに委任することです。これは、クライアント コードが言語レベルまたは Python のようなダック タイピング言語のインターフェイスのいずれも想定していない場合に機能します。

両方のアプローチの 2 つのインターフェースを と組み合わせComposite Patternて、Compositeオブジェクトを各 の個々の実装に委譲させるInterfaceことができます。これにより、依存関係の挿入が容易になります。Google Guice などを使用して、コードをより柔軟にします。

于 2012-05-15T22:28:29.280 に答える