gpt4 book ai didi

java - List 包含不同子类的对象

转载 作者:行者123 更新时间:2023-12-01 17:44:39 25 4
gpt4 key购买 nike

现在我有一个 Animal 类,并扩展了它的三个子类:Dog、Cat 和 Fish。

class Dog extends Animal {
public void bark(){}
}
class Cat extends Animal {
public void catchMouse(){}
}
class Fish extends Animal {
public void swim(){}
}

我有一个列表:

List<Animal> listOfAnimals = new ArrayList<>();

然后我使用静态方法将 Dog、Cat 和 Fish 对象添加到列表中:

public static void addAnimal(List<Animal> list, AnimalInfo info) {
Animal animal = new Animal();
switch (info) {
case 0:
animal = new Dog();
break;
case 1:
animal = new Cat();
break;
case 2:
animal = new Fish();
break;
}
list.add(animal);
}

我调用这个静态方法3次,并按顺序将一个Dog对象、一个Cat对象和一个Fish对象添加到列表中。现在该列表应包含一个 Dog 实例、一个 Cat 实例和一个 Fish 实例。

现在我想在 Dog 实例上调用 bark() :

list.get(0).bark();

但这显然行不通。

实现这一目标的最佳方法是什么?使用:

(Dog)(list.get(0)).bark();

最佳答案

我认为在这种情况下利用继承可能是一个好方法,但我想我会分享一个替代方案。

这里的另一种方法是使用访问者模式。当您在声明对象的类时不知道需要对对象执行什么操作时,或者如果您希望将上下文行为(例如更新另一个对象的状态)与 Animal 类分开(Separation关注)

abstract class Animal {
abstract void accept(AnimalVisitor visitor);
}
class Dog extends Animal {
void bark() { ... }

@Override
void accept(AnimalVisitor visitor) {
visitor.visit(this);
}
}
class Cat extends Animal {
void meow() { ... }

@Override
void accept(AnimalVisitor visitor) {
visitor.visit(this);
}
}

interface AnimalVisitor {
void visit(Dog dog);
void visit(Cat cat);
}

// Somewhere else...

AnimalVisitor voiceVisitor = new AnimalVisitor() {
@Override
void visit(Dog dog) {
dog.bark();
}

@Override
void visit(Cat cat) {
cat.meow();
}
}

animalList.get(0).accept(voiceVisitor);

关于java - List<Super Class> 包含不同子类的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57137607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com