Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос по методам подклассов

49K
17 июня 2009 года
AlexVB
3 / / 17.06.2009
Добрый день!

Начал изучать Java недавно, так что прошу прощения если вопрос дурацкий.

Есть класс Account, у него потомки Organization и Person (у каждого свой набор методов, специфичный для конкретного типа, например у Person - фамилия, имя, отчество, у Organization - название организации и т.д.).

Есть класс AccountManager, при помощи которого из базы достаются аккаунты (Person, либо Organization) по логину, например так:

Цитата:
AccountManager am = new AccountManager();
Account account = am.get("vasya");



get в AccountManager определено как:

Цитата:
Account get(String login);



возвращает объект типа Person либо Organization

Проблема в следующем:

т.к. не известно какого типа аккаунт будет возвращен то я получаю обьект типа Account, соответственно методы определенные в классе Person но отсутствующие в классе Account - не доступны.

Цитата:
Account account = am.get("vasya"); // здесь account - обьект класса Person



например account.firstName() вызовет ошибку, т.к. метод firstName определен в Person но не определен в Account.

Подскажите, как в данном случае сделать так чтобы методы специфичные для потомков стали доступны?

Спасибо.

240
17 июня 2009 года
aks
2.5K / / 14.07.2006
С одной стороны можно сделать что нибудь типа:
 
Код:
if (account instanceof Person) {
  Person person = (Person)account;
  person.firstName();
  ///....
}

С другой стороны такое обратное приведение как правило создает путаницу и зачастую свидетельствует о некачественной архитектуре.
Попробуй расписать, что у тебя такое Person и Organization и как они соотносятся с аккаунтами?
49K
17 июня 2009 года
AlexVB
3 / / 17.06.2009
Цитата: aks

Попробуй расписать, что у тебя такое Person и Organization и как они соотносятся с аккаунтами?



Предположим что эта программа - биллинг.

В данном случае у каждого пользователя (человека) биллинга есть своя учетная запись (Account). Учетные записи могут быть нескольких типов - Частные лица (Person) и организации (Organization).

У всех пользователей есть какие то одинаковые поля (например: логин, пароль, e-mail), которые определены в классе Account, и так же специфичные только для какого то конкретного типа, например у частного лица (Person) есть фамилия, имя, отчество, пол, и т.д. (определено в классе Person), у организации есть название организации, должность руководителя, фио руководителя, номер свидетельства о регистрации и т.д. (определено в классе Organization).

В каждом классе есть методы по названию одинаковые с атрибутами для их получения и изменения.

например в классе Account есть методы login(), password(), email(), которые если вызываются без параметров - возвращают текущее значение, если с параметрами - изменяют его. в классах Person и Organization аналогично.

т.е. Person и Organization - это все аккаунты, только разных типов.

Для добавления и получения аккаунтов в/из БД - класс AccountManager

Т.е. в итоге получается из AccountManager аккаунт типа Account который на самом деле типа Person, и нужно изменить/получить что то характерное только для Person, чего нет в Account и других его потомках:

Цитата:
account.firstName();

355
17 июня 2009 года
<SCORP>
786 / / 21.10.2006
ну в таком случае, по-моему, использование instanceof вполне оправдано. оно понадобиться только в достаточно специфичных случаях
49K
18 июня 2009 года
AlexVB
3 / / 17.06.2009
ОК. Спасибо всем за ответы.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог