|
5 / 5 / 2
Регистрация: 21.07.2016
Сообщений: 34
|
|||||||||||||||||||||
Доступ к дочерним классам из родительского27.07.2016, 06:14. Показов 7851. Ответов 4
Метки нет (Все метки)
Многим известно, что родительский класс ничего не должен знать о своих потомках. Упоминание дочерних классов в родительском считается плохим тоном, нарушающим принципы ООП и т.п. (в Java я знаю только один случай такого - это класс Number). Но у меня возникла ситуация, в которой задача прекрасно решается этим самым "плохим тоном". А пишу я сюда, потому что практически уверен, что имеется иной, более правильный способ, и, быть может, вы его подскажете.
Задача самая что ни на есть типичная. Имеется список объектов, который выводится в GUI-списке (неважно, будь то ListView или TreeView). Объекты разные и потому у них очень много различающихся полей. Но все они - потомки одного класса, назовем его Animal:
Как делаю я. Т.к. получить можно только родительский класс, то в него я и добавляю ссылки на всех его потомков:
0
|
|||||||||||||||||||||
| 27.07.2016, 06:14 | |
|
Ответы с готовыми решениями:
4
Доступ к классам апплета Использование родительского метода с дочерним параметром Доступ к методу родительского класса из метода свойства родительского класса |
|
Автоматизируй это!
|
||||||
| 27.07.2016, 10:51 | ||||||
|
JavaFX2, а мне понравилось твое решение, необычно!
я бы конечно сделал не в родительском классе, а в коде нечто вроде
0
|
||||||
|
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
|
|||
| 27.07.2016, 11:29 | |||
|
JavaFX2, решение вашей задачи должно начинаться с правильно архитектуры. Такого рода задачи решаются через интерфейсы и\или абстрактные методы базового класса. Если кратко, то вам нужно определить некий интерфейс который описывает поведение объекта когда на него кликнули. Затем базовый класс должен имплементировать этот интерфейс и описать базовое поведение. Поведение дочерних классов должно описываться в дочерних классах и при надобности вызываться через абстрактные методы базового класса. Так же можно написать некий вспомогательный класс скажем ListViewPopulator, который будет работать с объектами интерфейса и будет знать как отображать каждый объект. На словах объяснить довольно сложно. Попробуйте составить архитектуру, построить диаграмму классов и выложить её сюда прежде чем начнете писать код.
0
|
|||
|
5 / 5 / 2
Регистрация: 21.07.2016
Сообщений: 34
|
|||||||||||
| 12.08.2016, 10:22 [ТС] | |||||||||||
|
Потребовалось расширить функционал программы, и заодно решил провести рефакторинг в тех местах, где он явно просится. Разумеется, вышеописанная проблема - одно из них. И честно говоря, чуть ли не единственное, требующее рефакторинга.
KEKCoGEN, я несколько раз возвращался к тому, как можно заменить явное указание дочерних классов на более-менее адекватный полиморфизм в рамках ООП. Но полностью устраивающего меня решения я так и не нашел. Наверное мне не хватило степени абстрагирования, в попытках найти решение через Единственное, что мне пришло в голову - это передавать переопределяемым (в дочерних классах) методам сам контроллер, в котором прописаны ВСЕ поля textfield, которые вообще участвуют в биндинге. И далее уже в каждом дочернем классе использовать те поля, которые этому дочернему классу необходимы:
Первое, что напрашивается - это перевести всю логику биндинга в третий отдельный класс, который и будет связывать контроллер и классы Animal (назовем для простоты Helper) - какое-никакое, но улучшение. Только вот, что писать в контроллере после Animal animal = list_view.getSelected()? Helper.bind(controller, animal)?? Не пойдет. Ведь Helper не знает заранее, какой именно Animal выделен и мы вернулись к тому, с чего начали - к проблеме определения текущего подкласса. Значит надо делать как-то иначе, а все размышления по поводу поведенческих интерфейсов и ListViewPopulator мне ничего не дали... Так что тут у меня кончились идеи и поэтому буду благодарен, если кто поделится своими.
0
|
|||||||||||
|
Автоматизируй это!
|
|
| 12.08.2016, 22:27 | |
|
JavaFX2, а не думал в родительском абстрактном классе реализовать просто все? все методы и поля прописать -хвосты, рога, плавники, этакий суперпредок всех многоклеточных
. А уже в конкретных реализациях оверрайдить нужные методы и полям что то присваивать, остальное оставляя пустым? Соответственно при выборе кого то из потомков нам не важно кто это, просто все не пустые поля выводим.
0
|
|
| 12.08.2016, 22:27 | |
|
Помогаю со студенческими работами здесь
5
Доступ к дочерним объектам TableView
CSS: доступ к классам Выборочный доступ к классам. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
|
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д.
Сборка примера
Скачайте. . .
|