Java 如何检查一个类是否扩展了另一个类
我见过这个问题的各种变体,但没有一个真正解决我的问题 假设我正在建设一支有阶级的军队。在继承结构的顶部,我有一个抽象的“单元”类。然后是一个抽象的“飞行”、“地面””和“建筑””类,用于扩展单元。然后是一个具体的“直升机”和“喷气式飞机”类,扩展飞行范围。以及延伸地面的混凝土“士兵”和“坦克”。最后是延伸建筑的“总部”和“供应” 以下是“士兵”类下的方法: 我希望敌人是任何形式的单位。这是因为士兵应该能够攻击建筑物和其他地面单位,但我不希望士兵能够攻击飞行物体 明显的问题是,因为我将敌人声明为一个单位,它不知道它属于哪个子类,因此试图为不存在的单位找到一个超类 我相信我可以有一个getter为每个单位手动设置什么类型的单位是。。。但这是更多的工作,似乎没有效率 变化Java 如何检查一个类是否扩展了另一个类,java,class,object,inheritance,methods,Java,Class,Object,Inheritance,Methods,我见过这个问题的各种变体,但没有一个真正解决我的问题 假设我正在建设一支有阶级的军队。在继承结构的顶部,我有一个抽象的“单元”类。然后是一个抽象的“飞行”、“地面””和“建筑””类,用于扩展单元。然后是一个具体的“直升机”和“喷气式飞机”类,扩展飞行范围。以及延伸地面的混凝土“士兵”和“坦克”。最后是延伸建筑的“总部”和“供应” 以下是“士兵”类下的方法: 我希望敌人是任何形式的单位。这是因为士兵应该能够攻击建筑物和其他地面单位,但我不希望士兵能够攻击飞行物体 明显的问题是,因为我将敌人声明为一
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");
}
}