5 / 5 / 2
Регистрация: 21.07.2016
Сообщений: 34
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Доступ к дочерним классам из родительского27.07.2016, 06:14. Показов 7194. Ответов 4
Метки нет (Все метки)
Многим известно, что родительский класс ничего не должен знать о своих потомках. Упоминание дочерних классов в родительском считается плохим тоном, нарушающим принципы ООП и т.п. (в Java я знаю только один случай такого - это класс Number). Но у меня возникла ситуация, в которой задача прекрасно решается этим самым "плохим тоном". А пишу я сюда, потому что практически уверен, что имеется иной, более правильный способ, и, быть может, вы его подскажете.
Задача самая что ни на есть типичная. Имеется список объектов, который выводится в GUI-списке (неважно, будь то ListView или TreeView). Объекты разные и потому у них очень много различающихся полей. Но все они - потомки одного класса, назовем его Animal:
Как делаю я. Т.к. получить можно только родительский класс, то в него я и добавляю ссылки на всех его потомков:
0
|
27.07.2016, 06:14 | |
Ответы с готовыми решениями:
4
Доступ к классам апплета Использование родительского метода с дочерним параметром Доступ к методу родительского класса из метода свойства родительского класса Доступ к дочерним объектам TableView |
Автоматизируй это!
|
||||||
27.07.2016, 10:51 | 2 | |||||
JavaFX2, а мне понравилось твое решение, необычно!
я бы конечно сделал не в родительском классе, а в коде нечто вроде
0
|
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
|
|
27.07.2016, 11:29 | 3 |
нет, не оправдан
использовать instanceof это такое же нарушение ООП. JavaFX2, решение вашей задачи должно начинаться с правильно архитектуры. Такого рода задачи решаются через интерфейсы и\или абстрактные методы базового класса. Если кратко, то вам нужно определить некий интерфейс который описывает поведение объекта когда на него кликнули. Затем базовый класс должен имплементировать этот интерфейс и описать базовое поведение. Поведение дочерних классов должно описываться в дочерних классах и при надобности вызываться через абстрактные методы базового класса. Так же можно написать некий вспомогательный класс скажем ListViewPopulator, который будет работать с объектами интерфейса и будет знать как отображать каждый объект. На словах объяснить довольно сложно. Попробуйте составить архитектуру, построить диаграмму классов и выложить её сюда прежде чем начнете писать код.
0
|
5 / 5 / 2
Регистрация: 21.07.2016
Сообщений: 34
|
|||||||||||
12.08.2016, 10:22 [ТС] | 4 | ||||||||||
Потребовалось расширить функционал программы, и заодно решил провести рефакторинг в тех местах, где он явно просится. Разумеется, вышеописанная проблема - одно из них. И честно говоря, чуть ли не единственное, требующее рефакторинга.
KEKCoGEN, я несколько раз возвращался к тому, как можно заменить явное указание дочерних классов на более-менее адекватный полиморфизм в рамках ООП. Но полностью устраивающего меня решения я так и не нашел. Наверное мне не хватило степени абстрагирования, в попытках найти решение через Единственное, что мне пришло в голову - это передавать переопределяемым (в дочерних классах) методам сам контроллер, в котором прописаны ВСЕ поля textfield, которые вообще участвуют в биндинге. И далее уже в каждом дочернем классе использовать те поля, которые этому дочернему классу необходимы:
Первое, что напрашивается - это перевести всю логику биндинга в третий отдельный класс, который и будет связывать контроллер и классы Animal (назовем для простоты Helper) - какое-никакое, но улучшение. Только вот, что писать в контроллере после Animal animal = list_view.getSelected()? Helper.bind(controller, animal)?? Не пойдет. Ведь Helper не знает заранее, какой именно Animal выделен и мы вернулись к тому, с чего начали - к проблеме определения текущего подкласса. Значит надо делать как-то иначе, а все размышления по поводу поведенческих интерфейсов и ListViewPopulator мне ничего не дали... Так что тут у меня кончились идеи и поэтому буду благодарен, если кто поделится своими.
0
|
Автоматизируй это!
|
|
12.08.2016, 22:27 | 5 |
JavaFX2, а не думал в родительском абстрактном классе реализовать просто все? все методы и поля прописать -хвосты, рога, плавники, этакий суперпредок всех многоклеточных . А уже в конкретных реализациях оверрайдить нужные методы и полям что то присваивать, остальное оставляя пустым? Соответственно при выборе кого то из потомков нам не важно кто это, просто все не пустые поля выводим.
0
|
12.08.2016, 22:27 | |
12.08.2016, 22:27 | |
Помогаю со студенческими работами здесь
5
Доступ к дочерним объектам в TabView в Qml Qt Доступ к дочерним элементам скопированного элемента CSS: доступ к классам Выборочный доступ к классам. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |