如果有父项,则Java intanceof false

如果有父项,则Java intanceof false,java,instanceof,parents,Java,Instanceof,Parents,我正在创建某种成就系统,我有一个类KillXEnemies,然后我从中继承了类killxenemieswearm(用某种武器杀死的敌人)。当你杀死一个敌人时,我会在成就对象中循环,并添加一个敌人已被杀死: if(object instanceof KillXEnemies) ((KillXEnemies)object).addEnemyKilled(); 但是KillXEnemies武器也会被追踪,因为它继承自KillXEnemies。我知道一个解决方案是: if(object ins

我正在创建某种成就系统,我有一个类KillXEnemies,然后我从中继承了类killxenemieswearm(用某种武器杀死的敌人)。当你杀死一个敌人时,我会在成就对象中循环,并添加一个敌人已被杀死:

if(object instanceof KillXEnemies)
    ((KillXEnemies)object).addEnemyKilled();
但是KillXEnemies武器也会被追踪,因为它继承自KillXEnemies。我知道一个解决方案是:

if(object instanceof KillXEnemies && !(object instanceof KillXEnemiesWeapon))
    ((KillXEnemies)object).addEnemyKilled();
但我即将得到很多继承自KillXEnemies的类,拥有20个类似乎是一个糟糕的解决方案!(对象实例of(---))

因此,我想知道是否有一种更简单的方法来检查对象是否仅是KillXEnemies而不是killxenemieswiller

您可以使用它来获取对象的实际类,然后将其与
KillXEnemies.class
进行比较

if (object.getClass().equals(KillXEnemies.class))
这将是
true
object
KillXEnemies
但如果
object
是它的子类的实例,则不是

但是我想知道(并且认识到你要处理的信息比我多得多,所以我很可能是错的)类和子类是否是对这些信息建模的最佳方式…

你可以用来获取对象的实际类,然后将其与
KillXEnemies.class
进行比较

if (object.getClass().equals(KillXEnemies.class))
这将是
true
object
KillXEnemies
但如果
object
是它的子类的实例,则不是


但是我想知道(并且认识到你要处理的信息比我多得多,所以我很容易出错)类和子类是否是建模这些信息的最佳方式…

使用可怜的人RTTI。让每个具体类实现一个基本的getObjType()方法。 它可能会比一个瞬间森林更干净、更快

switch(obj.getObjType()){
   case KillXEnemies.TYPE_ID:
       doSomething((KillXEnemies)obj);
   break; 
  case KillXEnemiesWeapon.TYPE_ID:
       doSomething((KillXEnemiesWeapon)obj);
   break;
   //and so on ...
}

使用可怜的男人RTTI。让每个具体类实现一个基本的getObjType()方法。 它可能会比一个瞬间森林更干净、更快

switch(obj.getObjType()){
   case KillXEnemies.TYPE_ID:
       doSomething((KillXEnemies)obj);
   break; 
  case KillXEnemiesWeapon.TYPE_ID:
       doSomething((KillXEnemiesWeapon)obj);
   break;
   //and so on ...
}

添加一个标志,比如parentClass,对于父类为true,对于所有子类为false,怎么样?因此,您的条件是if(KillXEnemies&((KillXEnemies)object.isParentClass()){

添加一个类似parentClass的标志,它对父类为true,对所有子类为false。因此您的条件是if(KillXEnemies&((KillXEnemies)object.isParentClass()){

我会用重写的方法来实现这一点。在
KillXEnemies
中有一个public
boolean doesKillEnemies()
方法。提供一个默认的实现,并根据需要进行修改,使其在对象杀死敌人的类中返回true,在所有其他子类中返回false

然后,测试变成:

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

我会用重写的方法来实现这一点。在
KillXEnemies
中有一个方法public
boolean doesKillEnemies()
。提供一个默认的实现和wverride,使其在对象确实杀死敌人的类中返回true,在所有其他子类中返回false

然后,测试变成:

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

也许考虑将参数添加到AddiBunyKLIDE()方法中,包括一些元数据,例如被杀死的敌人或被使用的武器等。

这样,类本身就可以重载该方法,并具有相应操作所需的相关信息


(只是一个关于如何将逻辑放入类本身,而不是疯狂的实例化或类检查)的想法。

< P>可以考虑将参数添加到AddiBunyKLIDE()方法中,以包括一些元数据,例如被杀死的敌人或被使用的武器等。

这样,类本身就可以重载该方法,并具有相应操作所需的相关信息


(关于如何将逻辑引入类本身以及如何从疯狂的实例或类检查中解脱出来,只有一个想法。)

通常,当您遇到大量实例问题或精确类检查问题时,这是次优继承结构的标志。您的实例不太清楚,所以有点难以判断……通常,当您遇到大量实例问题或精确类检查问题时,这是次优继承结构的标志-最佳继承结构。不太清楚你的实例是什么,所以有点难说……如果你必须这样解决问题,那么你的方法就出了问题。真的很难看。@Erik:是的,这就是我最后一句话的意思。:-)如果你必须这样解决问题,那么ng的方法是错误的。真是丑陋的解决方案。@Erik:是的,我在最后一句话中就是这么说的。:-)