Как указать, к какому дочернему классу принадлежит этот объект после получения из хэш-карты? - PullRequest
0 голосов
/ 27 мая 2010

у меня есть родительский класс Course и два дочерних класса PostgradCourse и UndergradCourse. у меня есть HashMap курсы HashMap; я храню все объекты postgradCourse и undergradCourse в хэш-карте.

Я хочу получить объект undergradCourse из хэш-карты, используя ключ. Course course = courses.get (courseCode); Затем я хочу вызвать метод в классе UndergradCourse, метод setUnits () course.setUnits (); но компилятор говорит, что не может найти символ-метод setUnit ()

Я почти уверен, что проблема в том, что компилятор ищет метод setUnit () в классе Course вместо класса UndergradCourse

Я сделал это, но это не работает UndergradCourse course = courses.get (courseCode); приводит к несовместимому типу

Так как же я могу получить объект undergradCourse из hashmap как объект undergradCourse вместо объекта курса? тогда я могу вызвать метод внутри дочернего класса

заранее спасибо

Ответы [ 2 ]

1 голос
/ 27 мая 2010

Карта хранит два разных типа курса. Когда вы извлекаете курс из карты, вы не знаете, какой тип курса вы извлекли.

Чтобы это исправить, если вы программируете на C ++, есть как минимум три альтернативных способа справиться с этим:

  1. Имеют две разные карты: одну карту курсов для студентов и другую карту курсов для аспирантов (вместо одной карты базовых курсов).
  2. Когда вы получаете базовый курс из одной карты, приведите объект (используя static_cast или dynamic_cast) к типу подкласса, который вы знаете / надеетесь, что это
  3. Объявите метод setUnit как виртуальный (возможно, чисто виртуальный) в абстрактном базовом курсе и предоставьте ему две различные реализации в подклассах: тогда, поскольку он объявлен в базовом курсе, вы можете вызвать его для объекта базового курса, получить с карты.
0 голосов
/ 27 мая 2010

Если вы программируете на Java, вы можете использовать оператор instanceof , чтобы определить, принадлежит ли объект определенному типу.

Course course = courses.get(courseCode)
if(course instanceof UndergradCourse)
{
    UndergradCourse undergradCourse = (UndergradCourse)course;
    // do you stuff with the undergrad course
}

Примечание: В зависимости от фактического типа объекта нарушается объектно-ориентированное программирование. Это не считается хорошим стилем.

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