问题描述
我正在练习政治主义,等级制度和接口,所以我决定创建一个“鸭子”类,该类可以散步,游泳和飞翔,还创建了鹰类和飞鱼类。
Duck实现了3种界面:水上,陆地和空中 Eagle实现2个接口:空中和地面 Flyer Fish实现了2种界面:空中和水上
这些接口是从Animal扩展的,只有一种方法:
public void eat();
然后我决定创建一个数组并触发其各自的动作:
List<Animal> animals = new ArrayList<Animal>();
FlyerFish ff = new FlyerFish();
Eagle eg = new Eagle();
Duck dk= new Duck();
animals.add(ff);
animals.add(eg);
animals.add(dk);
foreach(Animal animal : animals){
if(animal instanceof Acuatico) {
((Acuatico) animal).swim();
}
if(animal instanceof Terrestre) {
((Terrestre) animal).walk();
}
if(animal instanceof Aereo) {
((Aereo) animal).fly();
}
}
我认为所有这些强制转换都是不必要的或可以避免的。
解决方法
我认为所有这些强制转换都是不必要的或可以避免的。
不是。您对animal
所了解的只是它的类型为Animal
,它具有eat
方法。因此,您可以轻松调用animal.eat()
而无需强制转换。但是,并非所有Animal
都具有swim()
方法或walk()
或fly()
。这就是为什么您必须在调用该方法之前检查每种类型并进行强制转换。