![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| nc30 |
|
||||||
|
Интересующийся :) ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 24.6.2010 Где: Санкт-Петербург Репутация: 5 Всего: 8 |
Есть система классов:
Объекты этих классов обрабатывают специальные службы. Каждая работает на своем уровне (от Person до ServiceClient), но ряд действий одинаков: - записать объект в файл; - считать из файла список объектов и вернуть ссылку; - найти объект в файле и вернуть ссылку и т. п. Для этих нужд службам доступен класс Common с соответствующим набором статических методов. Первый вопрос: Как избежать вот такого:
Второй вопрос: Можно ли создать функцию, возвращающую <? extends Person> в зависимости от типа прочитанного из файла объекта? Вариант с коллекцией проходит, если использовать вызов с явным приведением:
А если нужно вернуть ссылку не на коллекцию, а на ее элемент? Пытался что-то делать с использованием Class, но как-то все наугад: опыта нет совсем |
||||||
|
|||||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 47 Всего: 159 |
Перенести метод saveSomeoneToFile в классы Person, Adult, ServiceClient и сделать его нестатическим. |
|||
|
||||
| nc30 |
|
||||
|
Интересующийся :) ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 24.6.2010 Где: Санкт-Петербург Репутация: 5 Всего: 8 |
Дело в том, что ни один из этих классов не знает, как его объекты будут обрабатываться. По условию задачи, они вполне могут находиться в составе подключаемой сторонней библиотеки. Наверное, можно включить данные методы в состав служебных классов (паспортный стол, ОЗАГС, отдел соцзащиты), которые обрабатывают объекты Person/Adult/ServiceClient. Но тогда получится, примерно, следующее:
... и так еще несколько служб. В каждой получается с полдесятка практически одинаковых методов. Отличие только в том, что типы передаваемых параметров (или возвращаемого значения) не одинаковы, а принадлежат к множеству наследников Person. Есть ли возможность более универсально подойти к решению данной задачи? |
||||
|
|||||
| aleksandy |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 260 Регистрация: 17.12.2006 Репутация: 4 Всего: 5 |
Оно, или я не понял задачи?
|
|||
|
||||
| nc30 |
|
||||
|
Интересующийся :) ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 24.6.2010 Где: Санкт-Петербург Репутация: 5 Всего: 8 |
Да, то что нужно, спасибо. Второй вопрос решен Остался первый. Есть возможность сделать подобное для параметра функции? Что-то вроде:
Т. е., чтобы один метод подходил для всех наследников Person. И еще. Посоветуйте, пож-та, где можно про эти механизмы почитать более подробно? |
||||
|
|||||
| ivanovpv |
|
|||
![]() Варвар ![]() ![]() Профиль Группа: Участник Сообщений: 639 Регистрация: 26.1.2005 Где: Москва Репутация: 4 Всего: 28 |
А почему нельзя передавать тип родителя в параметрах, а в теле функции распознавать точный тип?
-------------------- Aut viam inveniam aut faciam |
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 47 Всего: 159 |
Потому, что добавление нового наследника от Person потребует модификации кода метода saveSomeoneToFile, а не его расширения. Это нарушение Open Close Principle проектирования. |
|||
|
||||
| aleksandy |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 260 Регистрация: 17.12.2006 Репутация: 4 Всего: 5 |
|
|||
|
||||
| nc30 |
|
||||||||
|
Интересующийся :) ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 24.6.2010 Где: Санкт-Петербург Репутация: 5 Всего: 8 |
Спасибо за помощь. Заработало Немного подумав, я по этому же принципу переписал уже работающую функцию:
Стало более красиво. Это сообщение отредактировал(а) nc30 - 7.9.2010, 14:03 |
||||||||
|
|||||||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |