0

構造に問題があります。

Entityクラスを拡張するクラスのオブジェクトがいくつかあります。これらのクラスのいくつかは、Entityクラスの関数A()を上書きし、特定の入力(A(int input)など)を必要とします。

すべてのオブジェクトの関数A()を同時に呼び出す方法はありますか(つまり、クラスごとに個別のリストがない)?

現在、arrayList(entities)を使用してすべてのオブジェクトを格納し、それらをforループで型キャストしています。これはかなり厄介なようで、OOPのいくつかの基本原則を誤解していると確信しています。

    for (int i=0;i<entities.size();i++) {           
        Entity entityPre = (Entity) entities.get(i);

        if (entityPre instanceof subClass) { 
            subClass entity= (subClass) entityPre;
            entity.A(int Input);
        }else{
            entityPre.A();
        }
    }

どんな助けでも大いに感謝されるでしょう。

4

4 に答える 4

1

A()メソッド引数を変更したため、メソッドシグネチャを変更したため、実際にはオーバーライドしていません。

したがって、「通常の」オーバーライドメカニズムを使用することはできず、現在の実装に固執します。

基本クラスにメソッド引数を追加すると(使用していない場合でも)、メソッドを適切にオーバーライドして、ループの内容を単純化できます。しかし、個人的には、この変更のみを実行します。追加の引数は、基本クラスにとって意味があります

于 2012-12-24T13:07:22.437 に答える
0

私はあなたが実際に欲しいものを手に入れていません、そして上記の説明で「A」とは何ですかそれは関数またはクラスですそれが関数であるならどのようにあなたはこのように書くことができますか'if(entityPre instanceof A){A entity =(A) entityPre; entity.doLogic(int入力); }'最初に、「instanceOf」メソッドについて読む必要があります。JBの回答が役に立ちます。

于 2012-12-24T13:19:52.590 に答える
0

が基本エンティティクラスのメソッドであり、サブクラスでオーバーライドされている場合A(int)、型キャストは必要ありません。それがポリモーフィズムのすべてです。

for (Entity entity : entities) {           
    entity.A(input);
}

補足:メソッドと変数には実際にはより適切な名前を選択し、Javaの命名規則を尊重する必要があります。メソッドは小文字で始まりますが、クラスは大文字で始まります。

于 2012-12-24T13:05:22.370 に答える
0

あなたが現在していることは正しいです。

すべてのオブジェクトの関数A()を同時に呼び出す方法はありますか?

いいえ、メソッドは、次のように宣言されていない限り、オブジェクトを使用してのみ呼び出すことができますstatic.

于 2012-12-24T13:05:40.737 に答える