如何解决抽象类还是铸造?
我试图弄清楚在抽象超类中实现子类的各个方法还是强制转换是解决以下情况的更好方法。
假设我有一个抽象类 Animal
,它有两个子类,Dog
和 Cat
以及一个 Main
类,我在其中保存 Dog
和 {{1} 的对象} 在一个 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
)。我认为通过使用强制转换,我可以更精确地使用这些方法。
解决方法
meow()
和 bark()
不应在 Animal
类中定义。这些方法特定于 Cat
和 Dog
类。
您应该定义一个 abstract
方法,如下所示,在 Animal
类中,并在子类中 override
它。
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)
}
}
希望它能解答您的疑问。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。