Вопрос о наследовании ООП - PullRequest
0 голосов
/ 10 июля 2011

Возможен ли следующий сценарий:

  1. Создать пул объектов Animal с именем AnimalPool
  2. Выделите объект Animal (называемый myAnimal) из AnimalPool
  3. Приведение myAnimal к Cat
  4. Установить Cat -специфическое поле
  5. Сохранить myAnimal в массиве Animal (скажем, с индексом 0)
  6. Позже получите доступ к массиву, приведите индекс от 0 к Cat и проверьте поле, которое я установил в 4.

Ответы [ 3 ]

2 голосов
/ 10 июля 2011

Я думаю, что вы можете делать то, что вы пытаетесь сделать, но не ТОЧНО, как вы думаете об этом.Ваш AnimalPool будет по существу «фабрикой» животных (посмотрите шаблон фабрики, это может помочь, но это не важная часть здесь.) И удвоится как коллекция «животных».Создайте объект «Животное», который имеет все методы и свойства, общие для всех животных.Затем сделайте нужных вам животных, таких как «Кошка» и «Собака», и выведите их из базового класса «Животное».Затем в «AnimalPool» добавьте функции для создания и возврата определенных типов Animal, таких как getDog () и getCat (), или создайте одну функцию с параметром.Создайте этот конкретный тип с помощью фабрики AnimalPool, и, поскольку он является производным от «Animal», вы можете добавить его в список типов «Animal».Когда вы извлечете животных из списка AnimalPool, вы сможете привести их к соответствующим типам.В зависимости от способностей отражения вашего языка, вы можете даже получить объект, чтобы сказать вам, какой это тип.

Это просто простой случай использования наследования и фабричного шаблона.Посмотри на эти две вещи, и я думаю, ты будешь на легкой улице с тем, чего ты пытаешься достичь.Удачи, и надеюсь, это поможет.Я могу дать вам пример кода, если вам это нужно.: -)

2 голосов
/ 10 июля 2011

на 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 голос
/ 10 июля 2011

Зачем вам кастовать объект второй раз в точке 6?В любом случае это будет тип Cat, так что нет необходимости делать это.И да, поле будет установлено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...