8

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

可以说我正在建立一支有班级的军队。在我的继承结构的顶部,我有一个抽象的“单元”类。然后是扩展单元的抽象“ Flying ”、“ Ground ”和“ Building ”类。然后是扩展 Flying 的具体“直升机”和“喷气机”类。以及扩展地面的具体“士兵”和“坦克”类。最后是扩展建筑的“总部”和“供应”。

下面是“士兵”类下的一个方法:

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

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

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

我敢肯定,我可以为每个手动设置单元类型的单元设置一个吸气剂……但这需要更多的工作,而且似乎效率不高。

4

8 回答 8

15

改变

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

if(enemy instanceof Flying){

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

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

于 2013-04-17T08:28:50.930 回答
2

You can use instanceof for this. This also works i.e. for interfaces.

Take also care that the variable may not be null when using instanceof.

class B extends 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");
    }
   }
于 2013-04-17T08:33:43.957 回答
2

尝试使用instanceof运算符。

    if(enemy instanceof Flying){
        System.out.print("Soldiers cant attack flying units");
    }
    else{
        attack(enemy);
    }
于 2013-04-17T08:29:35.927 回答
1

尝试if(enemy instanceof Flying) {}

于 2013-04-17T08:31:01.680 回答
1
if (enemy instanceof Flying)
   ...
于 2013-04-17T08:29:10.953 回答
1

你试过了吗:

if (enemy instanceof Flying)
于 2013-04-17T08:29:16.557 回答
1

我认为您正在寻找instanceof operator

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

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

if(enemy instanceof Flying){
   System.out.print("Soldiers cant attack flying units");
}
else{
    attack(enemy);
}
于 2013-04-17T08:30:16.427 回答
0

这是一种设计气味。基本要求是访问者模式的一项工作,但在访问访问者之前,您还应该寻找比这更好的多态性。

于 2013-04-17T08:49:31.737 回答