OOP继承问题

时间:2011-07-10 14:54:02

标签: java oop inheritance

以下情况是否可行:

  1. 创建Animal的对象池,名为AnimalPool
  2. Animal
  3. 分配myAnimal个对象(名为AnimalPool
  4. myAnimal投放到Cat
  5. 设置Cat特定字段
  6. myAnimal存储到Animal(比如索引0)
  7. 的数组中
  8. 稍后访问该数组,并将索引0转换为Cat并检查我在4中设置的字段。

3 个答案:

答案 0 :(得分:2)

Java中的

在第2点你创建Animal然后在3中你不能把它投射到Cat

如果

class Animal {
}

class Cat extends Animal { 
 private String mewTone; 
 public void setMewTone(String t){
  this.mewTone = t;
 }
}

你可以拥有Animal的游泳池,但是如果你想要投射到Cat并使用方法setMewTone,那么给定的对象必须是Cat。你可以检查一下。例如:

Animal animal = objectPool.get();
if(animal instanceof Cat){
  Cat castedToCat = (Cat)animal;
  castedToCat.setMewTone("horrible");
} else {
  System.out.println("This is not a cat.");
}

所以当你运行它时:

    ObjectPool<Animal> objectPool = new ObjectPool<Animal>();
    objectPool.add(new Animal());
    Animal animal = objectPool.get();
    ((Cat)animal).setMewTone("sth");

您将获得java.lang.ClassCastException: Animal cannot be cast to Cat

  • 另一件事是,这是可能的另一种OO语言(动态类型)
  • 在这种情况下考虑使用其他模式

答案 1 :(得分:2)

我认为你可以做你想做的事情,而不是你想要做的事情。你的AnimalPool本质上是一个动物“工厂”(查找工厂模式,它可能有所帮助,但它不是这里的重要部分。),并且作为“动物”的集合加倍。制作一个“动物”对象,它拥有所有动物共有的所有方法和属性。然后制作你需要的动物,如“猫”和“狗”,并从“动物”的基类中获取它们。然后在“AnimalPool”中添加函数以创建和返回特定类型的Animal,例如getDog()和getCat(),或者使用参数创建一个函数。使用AnimalPool工厂创建该特定类型,并且因为它派生自“Animal”,您可以将其添加到“Animal”类型的列表中。从AnimalPool列表中检索动物时,您将能够将它们转换为适当的类型。根据您的语言的反射功能,您甚至可以让对象告诉您它的类型。

这只是使用继承和工厂模式的简单情况。看看这两件事情,我想你会在你想要完成的事情上轻松上街。祝你好运,并希望它有所帮助。如果需要,我可以给你一个代码示例。 : - )

答案 2 :(得分:1)

为什么你会在第6点第二次施放物体?无论如何它将是Cat型,所以不需要这样做。是的,该字段将被设置。