java - 在 Object 的 ArrayList 中,如何将 Object 转换为 ArrayList 中包含的类的 3 个实例之一?

标签 java object arraylist

我正在做一个简单的 Zoo 应用程序来理解 Java 中的面向对象概念。

我的模型如下: 1) 一个动物园有多个笼子 2) 笼子里混合了猫科动物、灵长类动物或鸟类 3) 动物可以吃、睡或喝 4) Feline extends Animal(做额外的猫科动物) 5) Primate extends Animal(做额外的灵长类动物) 6) Bird extends Animal(做额外的 Bird 东西)

问题:

虽然在动物园中处理 x 数量的笼子(笼子数组列表)非常容易,但我正在努力处理笼子里的动物。 我发现我需要一个对象的 ArrayList。

到目前为止一切顺利,但是当我试图找回我的动物并让他抓一个帖子时,它不再是猫科动物,而是一个对象。

public class Cage{

        private String name;
        private ArrayList<Object> animals = new ArrayList<Object>();

        public Cage(String name){
            this.name = name;
        }

        public void addFeline(String name){
            Feline newFeline= new Feline(name);
            this.animals.add(newFeline);
        }

        public void addPrimate(String name){
            Primate newPrimate= new Primate(name);
            this.animals.add(newPrimate);
        }

        public void addBird(String name){
            Bird newBird= new Bird(name);
            this.animals.add(newBird);
        }

        public void removeAnimal(int index){
            this.animals.remove(index);
        }

        public Object getAnimal(int index){
            Object myAnimal = this.animals.get(index);
            return myAnimal;
        }
    }

我是这样调用它的:

Zoo myZoo = new Zoo("My Zoo");
myZoo.addCage("Monkey Exhibit");
Cage myCage = myZoo.getCage(0);
myCage.addFeline("Leo");
Object MyAnimal = myCage.getAnimal(0);

问题:如何将 Object 变回 Feline 类的实例,以便它可以抓取帖子?

最佳答案

我认为解决这个问题的最佳方法是使用策略设计模式。

Feline、Primate 和 Bird 应该实现一个 Animal 接口(interface)。然后 Cage 将有一个方法 public void addAnimal(Animal animal);

Feline、Primate 和 Bird 的对象创建应该在 Cage 之外。

如果有帮助,我已经整理了一些代码。我会设计类似于以下内容的应用程序。

应该使用接口(interface)封装行为。例如进食行为

public interface Animal {
    public String getName();
}
public interface EatingBehaviour {
    public void howManyTimes();
}

public class RealLionEatingBehaviour implements EatingBehaviour{
    @Override
    public void howManyTimes() {
        System.out.println("I eat once a day");
    }
}

public class ToyLionEatingBehaviour implements EatingBehaviour {
    @Override
    public void howManyTimes() {
        System.out.println("I never eat! I am a toy lion.");
    }
}

public abstract class Feline implements Animal{
    public abstract void scratchPost();
    private EatingBehaviour eatingBehaviour;
    public EatingBehaviour getEatingBehaviour() {
        return eatingBehaviour;
    }
    public void setEatingBehaviour(EatingBehaviour eatingBehaviour) {
        this.eatingBehaviour = eatingBehaviour;
    }
}

public class Lion extends Feline {
    private String name;
    public String getName() {
        return this.name; 
    }
    public void setName(String name) {
        this.name = name; 
    }
    Lion (String name) {
        this.name=name;
    }
    public void scratchPost(){
        System.out.println(getName() + " Lion Scratching Post!");
    }   
}

public class AnimalFactory {
    public static Animal getAnimalInstance(String type, String name){
        Animal animal=null;
        if ("lion".equalsIgnoreCase(type)) {
            animal = new Lion(name);
        }
        return animal;
    }
}

import java.util.ArrayList;
import java.util.List;

public class Cage {
    private List<Animal> animals = new ArrayList<Animal>();
    public void addAnimal(Animal animal) {
        animals.add(animal);
    }
    public void removeAnimal(int index){
        this.animals.remove(index);
    }
    public Animal getAnimal(int index){
        return this.animals.get(index);
    }   
}

public class Zoo {
    public static void main(String args[]) {
        Cage cage = new Cage();
        Animal animal = null;
        animal = AnimalFactory.getAnimalInstance("Lion", "Sweety");
        cage.addAnimal(animal);
        Animal animalFromCage = cage.getAnimal(0);
        if (animalFromCage instanceof Feline) {
            Feline feline = (Feline) animalFromCage;
            feline.setEatingBehaviour(new RealLionEatingBehaviour());
            feline.scratchPost();
            feline.getEatingBehaviour().howManyTimes();
            feline.setEatingBehaviour(new ToyLionEatingBehaviour());
            feline.getEatingBehaviour().howManyTimes();
        }
    }
} 

关于java - 在 Object 的 ArrayList 中,如何将 Object 转换为 ArrayList 中包含的类的 3 个实例之一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18048618/

相关文章:

java - 为什么在paint() 外部声明的变量在paint() 内部无法识别?

java - Arraylist 是一个比预期长的元素

java - 将 JDK 放在 ramdisk 上如何提高 IDE 性能?

java - 如何获取intellij插件中类的引用方法

C++以两种不同的方式从类中实例化一个对象

java - 在 toString 中打印 Arraylist,并用行分隔每个条目

java - 面向对象的三地址代码生成

java - 如何在 JSF 中截断字符串?

java - 在java中使用一个类

javascript - JSON.stringify(object) 不正确