繁体   English   中英

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

[英]How to Check if a class extends another

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

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

以下是“ 士兵 ”类下的方法:

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

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

as a Unit , it doesn't know which subclass it belongs to and therefore is trying to find a SuperClass for Unit which doesn't exist. 显而易见的问题是,因为我将声明为一个单位 ,它不知道它属于哪个子类,因此试图找到一个不存在的单位的超级类。

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

更改

if(enemy.getSuperclass().equals(Flying)){

if(enemy instanceof Flying){

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

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

尝试使用instanceof运算符。

    if(enemy instanceof Flying){
        System.out.print("Soldiers cant attack flying units");
    }
    else{
        attack(enemy);
    }

您可以使用instanceof。 这也适用于接口。

使用instanceof时也要注意变量可能不为null。

B级扩展A.

   public class test
   {
    public static void main(String[] args)
    {
        A a = new B();
        B b = new B();
        if(a instanceof A)
            System.out.println("B derived from A");
        if(b instanceof A)
            System.out.println("B derived from A");
    }
   }
if (enemy instanceof Flying)
   ...

你试过了吗:

if (enemy instanceof Flying)

我想你正在寻找instanceof 运营商

instanceof运算符将对象与指定的类型进行比较。 您可以使用它来测试对象是否是类的实例,子类的实例或实现特定接口的类的实例。

所以你可以更新你的功能如下:

if(enemy instanceof Flying){
   System.out.print("Soldiers cant attack flying units");
}
else{
    attack(enemy);
}

尝试if(enemy instanceof Flying) {}

这是一种设计气味。 基本要求是访问者模式的工作,但您甚至应该在访问访问者之前更好地使用多态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM