Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检查一个类是否扩展了另一个类_Java_Class_Object_Inheritance_Methods - Fatal编程技术网

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

Java 如何检查一个类是否扩展了另一个类,java,class,object,inheritance,methods,Java,Class,Object,Inheritance,Methods,我见过这个问题的各种变体,但没有一个真正解决我的问题 假设我正在建设一支有阶级的军队。在继承结构的顶部,我有一个抽象的“单元”类。然后是一个抽象的“飞行”、“地面””和“建筑””类,用于扩展单元。然后是一个具体的“直升机”和“喷气式飞机”类,扩展飞行范围。以及延伸地面的混凝土“士兵”和“坦克”。最后是延伸建筑的“总部”和“供应” 以下是“士兵”类下的方法: 我希望敌人是任何形式的单位。这是因为士兵应该能够攻击建筑物和其他地面单位,但我不希望士兵能够攻击飞行物体 明显的问题是,因为我将敌人声明为一

我见过这个问题的各种变体,但没有一个真正解决我的问题

假设我正在建设一支有阶级的军队。在继承结构的顶部,我有一个抽象的“单元”类。然后是一个抽象的“飞行”、“地面””和“建筑””类,用于扩展单元。然后是一个具体的“直升机”和“喷气式飞机”类,扩展飞行范围。以及延伸地面的混凝土“士兵”和“坦克”。最后是延伸建筑的“总部”和“供应”

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

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

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

我相信我可以有一个getter为每个单位手动设置什么类型的单位是。。。但这是更多的工作,似乎没有效率

变化

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

这将检查
敌人
是否是源自
飞行
的任何类的实例,而不是专门检查
飞行
类(我们知道
敌人
不会是,因为
飞行
是抽象的)

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

你尝试过:

if (enemy instanceof Flying)
   ...
if (enemy instanceof Flying)
尝试使用运算符

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

我想您正在寻找的实例

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");
    }
   }

这是一种设计味道。基本要求是的工作,但在你接触访问者之前,你还应该考虑更好地使用多态性。

Wow,在同一个10秒的时间片段中发布了5个等价的答案!你也可以使用接口,因为类继承可能限制对所有对象建模。但是首先尝试继承很好。惊奇的例子!我建议在飞行、地面和建筑类以及重载中实现攻击方法,为每种可能的攻击实现一种方法:例如在飞行类
攻击(飞行敌人)
攻击(地面敌人)
攻击(建筑敌人)
重新思考类设计是一个很好的建议。一个很好的方法可能是使用接口并在子类单元中实现公共部分。使用接口时,您不必担心某个类是从另一个类的特定实现中派生出来的,但您仍然可以确保bevhiour是相同的。是的,但接口不会让我创建cookie-cuter方法来应用于它下面的具体类。我必须为每个单元重新创建该方法。除非我不能正确理解接口。
if(enemy instanceof Flying){
   System.out.print("Soldiers cant attack flying units");
}
else{
    attack(enemy);
}
   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");
    }
   }