#java #oop #inheritance #design-patterns
#java #ооп #наследование #шаблоны проектирования
Вопрос:
Итак, я пытаюсь определить / запомнить, какой тип интерфейса / абстракции я должен использовать, чтобы заставить этот макет делать то, что я хочу. У меня есть два типа объектов:
Виджет и ComboWidget. Я хочу, чтобы оба они были реализованы в других классах. Как следует из названия, ComboWidget — это базовый класс, который будет состоять из нескольких объектов виджета. Я также хочу иметь некоторые стандартные функциональные возможности, такие как addWidget (), removeWidget (), listWigets () и т.д., Которые будут применяться ко всем элементам, реализующим ComboWidget.
Сам виджет будет делать то же самое, поскольку он будет реализован конкретными экземплярами виджетов (виджет кнопки, виджет панели заполнения и т.д.).
Я хочу иметь панель или таблицу, в которую пользователь может добавлять любой виджет или комбинированный виджет. Итак, для указанной панели я хочу в общем виде ссылаться на Widget или ComboWidget просто как на класс Widget, и это позволит либо, либо, в дополнение к любому другому объекту, который их реализует. Каков наилучший способ добиться этого?
Лучший способ объяснить это — своего рода чертеж:
Widget
|_ ComboWidget
|_ TableComboWidget
|_ BoomHeightComboWidget
|_ ButtonWidget
|_ FillBarWiget
|_ TextWidget
Я хочу иметь возможность создать функцию с надписью addWidget (виджет), и любое из вышеперечисленных значений может быть помещено в качестве аргумента. (За исключением самих виджетов и ComboWidget, поскольку они, скорее всего, будут интерфейсом / аннотациями)
Комментарии:
1. Подумайте о мебели и стуле. Мебель — это общее, а стул — специфическое. Вы не можете создать «мебель», но вы можете создать стул. Аналогично, похоже, что вы не можете создать
Widget
, но вы можете создатьButtonWidget
. СледовательноWidget
должно быть абстрактным, нет?2. Да, но напомните мне, может ли у вас быть базовый код в абстрактном классе?
3. Абстрактный базовый класс предназначен для хранения кода, общего для всех подклассов, например, у каждого
Widget
есть местоположение на экране. Следовательно, классWidget
будет иметь элемент данных, хранящий эту информацию.
Ответ №1:
То, что вы только что описали, очень похоже на составной шаблон
И я не вижу ничего плохого в вашем макете класса. Ваш метод addWigget должен работать так, как вы его описали.
Комментарии:
1. Спасибо. Но должен ли виджет / комбинированный виджет быть интерфейсами или абстрактными классами? Как ComboWidget должен расширяться за пределы виджета для достижения этого результата?
2. Оба должны быть абстрактными классами.
Ответ №2:
Изучите иерархию классов Java AWT. Он имеет структуру, которую вы ищете — Component
класс служит базовым классом каждого компонента AWT и Container
является эквивалентом вашего ComboWidget
.