0

基本クラスがありEntityます。のユーザーが特定のスーパークラスTを拡張Entityするインスタンスを作成できるようにしたい( s宣言がそうであるかのように)。Tが実際に何であるかを知らないので、その点でモジュール化したいと思います。それが不可能な場合は、特定のインターフェイスTを実装しても問題ありません。EntityEntityClass Entity extends TEntityEntity

のようなものpublic class Entity<T> extends Tpublic class Entity<T> implements T動作しません。(「タイプパラメータTをスーパータイプとして参照することはできません」)。

だから私の質問は:

1)これはJavaで達成することは可能ですか?他の言語?

2)もしそうなら、どのように?

3)通常、Javaがそのようなハードルを設定する場合、それは私のデザインに何か問題があることを意味します。そのため、この機能をどのように作成しますか(私が探しているのは、基本的にEntityとTからの多重継承ですが、これは可能ですか?) 。

編集:説明-呼び出し元からの要求をできるだけ少なくしながら、ミックスインタイプの動作を実現したいと思います(エンティティインスタンスへの呼び出しを委任するTのサブクラスを作成すると、呼び出し元からの要求が多すぎます)。これを行う他の方法はありませんか?

4

4 に答える 4

2

Java は多重継承をサポートしていません。特定のクラスを複数のクラスの直接のサブクラスにすることはできませ

ただし、がinterfaceEntityの場合は、交差境界を使用して実行できます。

たとえば、 のサブクラス (必ずしも直接のサブクラスではない) でSomeClassあり、 を実装するインスタンスを受け入れるメソッドをコーディングするには、次のようにしますEntity

public <T extends Entity & SomeClass> void doSomething(T t) {
}
于 2013-01-04T09:45:35.550 に答える
0

いいえ、それはJavaでどのように機能するかではありません。継承ではなく構成を検討することをお勧めします。

私はここの行の間を読んでいますが、これらのエンティティはゲームエンジンにありますか?コンポーネントシステムはうまく機能します...

http://gameprogrammingpatterns.com/component.html

これが簡単な例です...

class Entity {
    List<Component> components;

    void update() {
        for(Component component: components) {
            component.update(this);
        }
    }
}

interface Component {
    void update(Entity parent);
}

class MovementComponent implements Component ...
class AnimationComponent ...
class BehaviourComponent ...
于 2013-01-04T09:37:18.280 に答える
0

あなたの質問の鍵は、「特定のスーパークラス T を拡張する Entity のインスタンスを作成する」と言ったときです。オブジェクト (クラスのインスタンス) がクラスを拡張することはありません。クラスだけが他のクラスを拡張します。

おそらく必要なのは、インターフェイスを使用することです。Entity をインターフェイスにして、Entity を実装するクラスを作成し、それらのクラスをインスタンス化します。

于 2013-01-04T09:48:10.633 に答える
0
template <class A>
class B : public A
{

少なくとも C++ では可能です。

私はこれを自分の仕事で一度使用し、非常に密接に関連している 2 つのクラス (一方が他方から継承) に動作を追加しました。Decorator パターンも同様に機能する可能性があることに気がついたのは、ずっと後になってからのことです。と考えることもできるのではないでしょうか。

于 2013-01-04T09:32:12.767 に答える