抽象class还是铸造?

Abstract class or casting?

我试图弄清楚在抽象超级class 中实现子class 的各个方法,还是强制转换是处理以下场景的更好方法。 假设我有一个摘要 class Animal,它有两个子 classes,DogCat 以及一个 Main class 其中我将 DogCat 的对象保存在 Animal 数组中。以下是我将如何在更通用的数组中使用 subclasses 的方法。

class Main{
    public static void main(String[] args){
        Animal[] animalArray = new Animal[2];
        animalArray[0] = new Cat();
        animalArray[1] = new Dog();
        
        for (Animal a : animalArray){
            if (a.getClass().equals(Dog.class){
            ((Dog)a).bark();
            } else {
            ((Cat)a).meow();
            }
        }
    }
}

但是一位朋友建议转换不是最佳实践,我应该按以下方式在抽象 superclass 中定义每个方法:

public abstract class Animal{

    public abstract String meow(){
        return null;
    }
    public abstract String bark();
        return null;
    }
}

将这些方法的 return 值设置为 null 后,我需要使用 @Override 并在各自的子 class 中实现它们。

哪种方式更好?恐怕抽象 class 会太大并且将分配给子 class 的方法没有意义(即使他们所做的只是 return null).我认为通过使用转换我可以更精确地使用这些方法。

meow()bark() 不应在 Animal class 中定义。这些方法特定于 CatDog classes。 您应该定义一个 abstract 方法,如下所示,在 Animal class 和 override 子 classes.

public abstract class Animal {
   public abstract String action() {};
}

public class Dog extends Animal {
   @Override
   public String action() {
       //your implementation (bark)
   }
}

public class Cat extends Animal {
   @Override
   public String action() {
      //your implementation (meow)
   }
}

希望它能回答您的问题。