【问题标题】:How to Check if a class extends another如何检查一个类是否扩展了另一个类
【发布时间】:2013-04-09 22:11:50
【问题描述】:

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

假设我正在建立一支有班级的军队。在我的继承结构的顶部,我有一个抽象的“Unit”类。然后是扩展单元的抽象“Flying”、“Ground”和“Building”类。然后是扩展 Flying 的具体“Helicopter”和“Jet”类。以及扩展地面的具体“Soldier”和“Tank”类。最后是扩展建筑的“HQ”和“Supply”。

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

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

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

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

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

【问题讨论】:

  • 哇,在同一个 10 秒时间片内发布了 5 个等效答案!
  • 您也可以使用接口,因为类继承可能会限制所有模型。但首先尝试继承很好。
  • instanceof 惊叹!
  • 我建议在 Flying、Ground 和 Building 类中实现攻击方法,并重载,为每种可能的攻击实现一种方法:例如在 Flying 类中attack(Flying enemy)attack(Groung enemy)@987654324 @

标签: java class object inheritance methods


【解决方案1】:

改变

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

到

if(enemy instanceof Flying){

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

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

【讨论】:

  • 重新思考类设计是一个很好的建议。一个好方法也可能是使用接口并在子类 Unit 中实现公共部分。有了接口,您不必担心一个类是从另一个类的特定实现派生的,但您仍然可以确保其行为是相同的。
  • 是的,但是一个接口不会让我创建千篇一律的方法来应用到它下面的具体类。我将不得不为每个单元重新创建方法。除非我没有正确理解接口。
【解决方案2】:

尝试使用instanceof 运算符。

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

【讨论】:

    【解决方案3】:

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

    还要注意在使用 instanceof 时变量不能为空。

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

    【讨论】:

      【解决方案4】:
      if (enemy instanceof Flying)
         ...
      

      【讨论】:

        【解决方案5】:

        你试过了吗:

        if (enemy instanceof Flying)
        

        【讨论】:

          【解决方案6】:

          我想你正在寻找 instanceof operator 。

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

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

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

          【讨论】:

            【解决方案7】:

            试试if(enemy instanceof Flying) {}

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-06-09
                • 2015-08-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多