0

配列コレクションにゲームオブジェクトがありますが、それらは異なるクラスである可能性があります。私はその座標によってオブジェクトを見つけることができます:

Object obb = grid.getCellContent(insertObjectX, insertObjectY);

私がする必要があるのは、obb.canBeSubmerged == trueかどうかを見つけて、それを別の配列に移動することです。

問題は、コンパイラが使用したクラスを認識していないため、そのオブジェクト「canBeSubmerged」のプロパティを取得できないことです。

"obb.getClass() == myClass.class"可能なオブジェクトクラスごとにステートメントを実行するより簡単な方法があるのではないかと思います。

。。

編集:ここに行き詰まりのない提案に基づいて、実用的な解決策があります:

try {    
   java.lang.reflect.Field f1 = obb.getClass().getField("canBeSubmerged");
   java.lang.reflect.Field f2 = obb.getClass().getField("subObject"); 
   if (f1 != null) {       
      canBeSubmerged = f1.getBoolean(obb); 
      f2.setBoolean(obb, canBeSubmerged);
   } 
}catch (Exception e) { } 


//enter it into the submerged grid level and remove from the top grid level
if (canBeSubmerged){
    grid.removeObject(insertObjectX, insertObjectY);
    grid.putSubObjectInCell(insertObjectX, insertObjectY, obb);
}
4

3 に答える 3

1

プロパティをobb含むオブジェクトcanBeSubmergedが常に などの特定のクラス タイプである場合MyOBB.class、これを行うことができます...

if (obb instanceof MyOBB.class) {
    if (((MyOBB)obb).canBeSubmerged) {
       // do your work
    }
}

========= または ============

リフレクションの使用 (遅くなります)

try {
   Field f = obb.getClass().getField("canBeSubmerged");
   if (f!=null && f.getBoolean(obb)) {
      // do your work
   }
} catch (Exception e) {
}
于 2012-06-02T15:54:27.890 に答える
1

オブジェクトはおそらくすべて共通のスーパークラスを拡張するか、メソッドを定義する共通のインターフェースを実装する必要があります

public boolean canBeSubmerged();

public フィールドは使用しないでください。また、

if (obb.canBeSubmerged() == true)

次のように書くことができます

if (obb.canBeSubmerged())

これはより論理的で読みやすいものです。

于 2012-06-02T15:54:28.830 に答える
1

オブジェクトの 1 つの属性のみに関心がある場合は、それをインターフェイス
public interface Submergable {
boolean isSubmerged();に抽出できます。
}

そして、水没する可能性のあるすべてのオブジェクトにそれを実装させます。

それからあなたはすることができますObject instanceof Submergable

于 2012-06-02T16:03:00.803 に答える