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();

您不应该使用公共字段。还要注意

if (obb.canBeSubmerged() == true)

可以写成

if (obb.canBeSubmerged())

这更具逻辑性和可读性。

于 2012-06-02T15:54:28.830 回答
1

如果您只对对象的一个​​属性感兴趣,您可以将其提取到接口
public interface Submergable {
boolean isSubmerged();
}

并让所有可能淹没的物体实现它。

然后你可以做Object instanceof Submergable

于 2012-06-02T16:03:00.803 回答