如何检查一个类是否扩展了另一个类

Kro*_*907 6 java methods inheritance class object

我已经看到了这个问题的变种,但它们都没有真正解决我的问题.

让我们说我正在建立一个有班级的军队.在我的继承结构的顶部,我有一个抽象的" 单元 "类.然后是一个抽象的" 飞行 "," 地面 "和" 建筑 "类,它扩展了单位.然后是一个延伸飞行的具体" 直升机 "和" 喷气式 "课程.以及延伸地面的具体" 士兵 "和" 坦克 "类.最后是一个扩展建筑的" 总部 "和" 供应 ".

以下是" 士兵 "类下的方法:

public void attack(Unit enemy){
if(enemy.getSuperclass().equals(Flying)){
    System.out.print("Soldiers cant attack flying units");
}
else{
    //Code to attack enemy here
}
Run Code Online (Sandbox Code Playgroud)

我希望敌人成为任何形式的单位.这是因为士兵应该能够攻击建筑物和其他地面单位,但我不希望士兵能够攻击飞行物体.

显而易见的问题是,因为我将敌人声明为一个单位,它不知道它属于哪个子类,因此试图找到一个不存在的单位的超级类.

我确信我可以为每个单位设置一个吸气剂,它可以手动设置它是什么类型的单位......但这是更多的工作,似乎并不高效.

T.J*_*der 12

更改

if(enemy.getSuperclass().equals(Flying)){
Run Code Online (Sandbox Code Playgroud)

if(enemy instanceof Flying){
Run Code Online (Sandbox Code Playgroud)

这将检查是否enemy是任何从派生的类的实例Flying,而不是检查具体Flying类(我们知道enemy不会,因为Flying是抽象的).

instanceof非常方便,但每当我使用它时(我有时会这样做),我退后一步看看我的结构,希望我能找到一些方法来重构以避免它(也许可以被士兵攻击的东西有一些共同的特征并且可以实现一个抽象的Unit子类 - GroundBased或者其他东西 - 你可以用它来代替参数Unit.在这种情况下你可能无法做到,但值得仔细检查.