1

私はある種のAchievementシステムを作成していて、KillXEnemiesクラスを持っていて、それからKillXEnemiesWeapon(特定の武器で殺された敵)のようなクラスを継承しています。そして、あなたが敵を殺すとき、私はアチーブメントオブジェクトをループし、敵が殺されたことを追加します:

if(object instanceof KillXEnemies)
    ((KillXEnemies)object).addEnemyKilled();

ただし、KillXEnemiesから継承するため、KillXEnemiesWeaponも追跡されます。私は1つの解決策が次のとおりであることを知っています:

if(object instanceof KillXEnemies && !(object instanceof KillXEnemiesWeapon))
    ((KillXEnemies)object).addEnemyKilled();

しかし、私はKillXEnemiesから継承する非常に多くのクラスを取得しようとしています。これは、20のようなものにするのは悪い解決策のようです!(object instanceof(---))

したがって、オブジェクトがKillXEnemiesWeaponではなくKillXEnemiesのみであるかどうかを確認する簡単な方法があるかどうか疑問に思っています。

4

5 に答える 5

5

を使用Object#getClassしてオブジェクトの実際のクラスを取得し、それをと比較できKillXEnemies.classます。

if (object.getClass().equals(KillXEnemies.class))

それはですが、そのサブクラスのインスタンスである場合はそうtrueobjectはありKillXEnemiesません。object

しかし、クラスとサブクラスがこの情報をモデル化するための最良の方法であるかどうか疑問に思います(そして、あなたが私よりも多くの情報を扱うことができるので、私は簡単に間違っている可能性があります)...

于 2013-03-15T08:53:55.307 に答える
1

addEnemyKilled() メソッドに引数を追加して、殺された敵や使用された武器などのメタデータを含めることを検討してください。

そうすれば、クラス自体がメソッドをオーバーロードでき、それに応じて動作するために必要な関連情報が得られます。

(ロジックをクラス自体に組み込み、クレイジーな instanceof またはクラス チェックから解放する方法についての 1 つのアイデアです。)

于 2013-03-15T09:13:54.370 に答える
0

貧乏人のRTTIを使用します。各具象クラスに基本のgetObjType()メソッドを実装させます。それはinstanceofのフォレストよりもクリーンで高速になる可能性があります。

switch(obj.getObjType()){
   case KillXEnemies.TYPE_ID:
       doSomething((KillXEnemies)obj);
   break; 
  case KillXEnemiesWeapon.TYPE_ID:
       doSomething((KillXEnemiesWeapon)obj);
   break;
   //and so on ...
}
于 2013-03-15T08:53:58.113 に答える
0

私はオーバーライドされたメソッドでこれを行います。でメソッドを publicboolean doesKillEnemies()にしKillXEnemiesます。オブジェクトが敵を殺すクラスで true を返し、他のすべてのサブクラスで false を返すように、必要に応じてデフォルトの実装と wverride を提供します。

テストは次のようになります。

if(object instanceof KillXEnemies && ((KillXEnemies)object).doesKillEnemies())
    ((KillXEnemies)object).addEnemyKilled();
于 2013-03-15T09:01:16.727 に答える
0

親クラスに対して true で、すべてのサブクラスに対して false である、parentClass のようなフラグを追加するのはどうですか? したがって、あなたの条件は次のようになります。

于 2013-03-15T08:54:43.597 に答える