Вопрос по методам подклассов
Начал изучать Java недавно, так что прошу прощения если вопрос дурацкий.
Есть класс Account, у него потомки Organization и Person (у каждого свой набор методов, специфичный для конкретного типа, например у Person - фамилия, имя, отчество, у Organization - название организации и т.д.).
Есть класс AccountManager, при помощи которого из базы достаются аккаунты (Person, либо Organization) по логину, например так:
Account account = am.get("vasya");
get в AccountManager определено как:
возвращает объект типа Person либо Organization
Проблема в следующем:
т.к. не известно какого типа аккаунт будет возвращен то я получаю обьект типа Account, соответственно методы определенные в классе Person но отсутствующие в классе Account - не доступны.
например account.firstName() вызовет ошибку, т.к. метод firstName определен в Person но не определен в Account.
Подскажите, как в данном случае сделать так чтобы методы специфичные для потомков стали доступны?
Спасибо.
Person person = (Person)account;
person.firstName();
///....
}
С другой стороны такое обратное приведение как правило создает путаницу и зачастую свидетельствует о некачественной архитектуре.
Попробуй расписать, что у тебя такое Person и Organization и как они соотносятся с аккаунтами?
Попробуй расписать, что у тебя такое 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 и других его потомках: