【发布时间】:2021-03-26 17:25:55
【问题描述】:
我试图弄清楚在抽象超类中实现子类的单个方法还是强制转换是处理以下场景的更好方法。
假设我有一个抽象类Animal,它有两个子类Dog 和Cat 和一个Main 类,我将Dog 和Cat 的对象保存在Animal 数组中。以下是我将如何在更通用的数组中使用子类的方法。
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();
}
}
}
}
但是,一位朋友建议强制转换不是最佳实践,我应该按以下方式定义抽象超类中的每个方法:
public abstract class Animal{
public abstract String meow(){
return null;
}
public abstract String bark();
return null;
}
}
将这些方法的返回值设置为null 后,我需要使用@Override 并在各自的子类中实现它们。
哪种方式更好?恐怕抽象类会太大,并且会将方法分配给没有意义的子类(即使它们所做的只是返回null)。我认为通过使用强制转换,我可以更精确地使用这些方法。
【问题讨论】:
-
meow()和bark()不应在Animal类中定义。这些方法特定于Cat和Dog类。您应该在Animal类中定义一个抽象方法,如public abstract String action() {};,在子类中定义override。 -
@neha 作为答案会很好(并且正确,恕我直言)。
-
@neha Ty 为您解答!我认为 getter 和 setter 方法不会是这样吗?如果我在
Dog中有一个不在Cat中的变量,但需要该变量的getter 和setter,我将如何在超类中实现它? -
@LucasB.Bahadir 如果你有这么多不同的变量,那么继承可能不是实现这一点的正确方法。仅凭你的例子很难说清楚。您说的是定义行为的方法,而不是数据。
-
@FedericoklezCulloca 子类本身没有很多不同的变量,但如果我说 3 个子类都有 1 个额外的变量,每个变量都需要一个 getter 和 setter,那么我最终有 6 个我的抽象超类中的方法,其中只有 2 个与任何给定的子类相关。这不会使超类过于臃肿吗?
标签: java casting abstract-class