英文:
How to create an Array of this class that implements 3 interfaces?
问题
我正在练习多态、继承和接口,所以我决定创建一个名为“Duck”的类,这个类可以行走、游泳和飞行,同时我也创建了一个名为“Eagle”的类和一个名为“Flyer Fish”的类。
Duck实现了3个接口:Aquatic(水生)、Terrestrial(陆生)和Aerial(空中)
Eagle实现了2个接口:Aerial和Terrestrial
Flyer Fish实现了2个接口:Aerial和Aquatic(水生)
这些接口都继承自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);
for (Animal animal : animals) {
if (animal instanceof Aquatic) {
((Aquatic) animal).swim();
}
if (animal instanceof Terrestrial) {
((Terrestrial) animal).walk();
}
if (animal instanceof Aerial) {
((Aerial) animal).fly();
}
}
我感觉所有这些强制转换是不必要的,或者可以避免。
英文:
I am practicing polimorfism ,hierarchy and interfaces, so I decide to create a class "Duck", this class can Walk, Swim and Fly, also I have created a class eagle and flyer fish.
Duck Implements 3 Interfaces : Aquatic, Terrestrial and Aerial
Eagle Implements 2 Interfaces : Aerial and Terrestrial
Flyer Fish Implements 2 Interfaces : Aerialand Aquatic
Those interfaces extends from Animal that has only one method:
public void eat();
Then I decide to create an Array and trigger their respective actions:
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();
}
}
I feel all those casts are unnecessary or can be avoided.
答案1
得分: 1
> 我觉得所有这些类型转换都是不必要的,或者可以避免。
事实并非如此。你所知道的关于 animal
的信息仅限于它是 Animal
类型,该类型具有 eat
方法。因此,你可以轻松地调用 animal.eat()
而无需进行类型转换。然而,并非所有的 Animal
都具有 swim()
方法,或者 walk()
方法,或者 fly()
方法。这就是为什么在调用那些方法之前必须对每种类型进行检查和类型转换的原因。
英文:
> I feel all those casts are unnecessary or can be avoided.
They are not. All you know about animal
is that it is of type Animal
, which has the eat
method. Therefore you can easily call animal.eat()
without casting. However, not all Animal
s have the swim()
method, or walk()
, or fly()
. That is why you have to check for each type and cast before calling that method.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论