Класс Java / структурирование наследования

#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 .