2

このループではEntity、タイプEntityのオブジェクトと、エンティティを拡張するタイプProjectileのオブジェクトを含むタイプのArrayListを反復処理しています。オブジェクトがProjectileのインスタンスである場合、以下のコードを実行したいと思います。ただし、getVelocity()メソッドはサブクラスProjectileにのみ存在し、Entityには存在しません。そのため、以下のコードをコンパイルできません。

個別のArrayListを使用するなど、これを回避する方法を考えることができます。ただし、重要なのは、すべてのエンティティを分離するのではなく、グローバルリスト内に保持することでした。この問題の簡単な解決策はありますか、それともコードの構造を変更する必要がありますか?

for (Entity f: glo.getList()) {
           if (f instanceof Projectile)
              f.setX(f.getVelocity()/rawFPS);
        }
4

5 に答える 5

5

これは、ゲームエンジンのティックごとに何らかの方法でエンティティを更新するループのようです。

私の意見では、よりクリーンな解決策は次のようになります。

class Entity {
  ...
  public void update() {}
  ...
}

class Projectile extends Entity {
  ...
  @Override
  public void update() {
    setX(velocity/rawFPS);
  }
  ...
}

私はあなたのアーキテクチャを知りません、あなたはに渡す必要があるかもしれないし、そうでないかもしれませrawFPSupdate()。(@Naveenが非常に正しく指摘しているように、これはあまりきれいではないので、できれば避けてください)。また、Entityそれ自体が機能を持たない抽象的である場合は、interfaceそもそもそれを作成することを検討してください。

于 2013-01-20T03:01:43.050 に答える
2

あなたの参照がサブクラスで宣言したものの手がかりがないif(f instanceof Projectile)タイプであるため、コンパイルが失敗することも事実です。Entity

Entity同じシグネチャを持つクラスの空白のメソッドをoverrideサブクラスのメソッドよりも提供instanceofし、クラスモデルに適合する場合はチェックを削除します

また

キャスティングを使用

if(f instanceof Projectile){
  ((Projectile)f).setX(..);
}
于 2013-01-20T02:55:06.603 に答える
2

Projectileコンパイルするには、としてキャストする必要があります。これを試して:

for (Entity f: glo.getList()) {
           if (f instanceof Projectile)
              f.setX(((Projectile)f).getVelocity()/rawFPS);
        }

これは、javaがオブジェクトが宣言されている型を常にチェックするために発生します。あなたの場合、これはEntityです。

@SuppressWarnings("unchecked")IDEとコードを読み取るすべての人が、チェックされていないキャストが意図的なものであることを認識できるように、を追加することをお勧めします。

于 2013-01-20T02:55:15.603 に答える
0

Entityメソッドが定義されたinterface、である必要があります。getVelocity()もちろん、問題をハックしてキャストすることはできますが、構築しているものに適した論理モデルは何かを自問してください。

于 2013-01-20T02:58:05.410 に答える
0

真剣に、みんな?吸うのインスタンス。Javaに関するすべてのガイドはそれを教えてくれます。

ここに何か問題があります。エンティティのセットをループし、別のデータ項目FPSを使用してサブセット(サブクラスインスタンス)の内部状態を変更しています。発射物の構築時にFPSがない場合、この外部クラスに後で注入させるのはランダムに思えます。FPSでセットを呼び出して、位置の更新を実行する方がクリーンな場合があります。

外側のクラスはおそらく発射体だけを要求する必要があります。

于 2013-01-20T03:01:30.263 に答える