Сегодня мой профессор заметил, что он считает странным, что, хотя философия SWT заключается в том, чтобы создавать собственные элементы управления композицией, Swing, похоже, предпочитает наследование.
У меня почти нет контакта с обеими платформами, но из того, что я помню в Windows Forms C #, обычно расширяют элементы управления, как Swing.
Поскольку люди обычно предпочитают композицию наследованию, почему люди Swing / Windows Forms не предпочитают композицию вместо наследования?
Ответы:
JComponent
выставляет много функциональности . ЕслиJComponent
бы интерфейс и компоненты были реализованы с композицией, простые компоненты должны были бы иметь десятки тривиальных оберток методов, напримерЕсть также причина эффективности, чтобы предпочесть наследование, а не композицию - переопределение ничего не стоит (при условии отсутствия
super
вызова), в то время как составление стоит доплатыINVOKEVIRTUAL
. Я не знаю, повлияло ли это на дизайн Swing, но это большая проблема для коллекционных классов.источник
Swing Framework фактически разработан в соответствии с Composite Design Pattern. Конечно, там много наследства, но вы обычно составляете свои собственные формы, используя композицию. То есть форма представляет собой композицию контейнеров промежуточного уровня и элементов управления.
источник
С Java намного проще использовать наследование только потому, что все виртуально. Нужно исправить "функцию" в JTable / JFrame? Расширьте его, переопределите методы задачи, а затем используйте всю свою таблицу / фрейм.
Я думаю, что с такими вещами, как WPF, где привязка данных является основной особенностью проекта, значительно упрощается создание композиции вместо наследования.
источник
virtual
и переопределить его, вы явно объявите его какoverride
. В java вы можете переопределить все, что видите, и увеличить его видимость в подклассе (вы можете сделать защищенные методы публичными в подклассе!)final
метод в Java, даже если сам базовый класс - нетfinal
.В статье 17 « Эффективная Java» Блох упоминает, что класс, предназначенный для наследования, «должен документировать свое самостоятельное использование переопределяемых методов». Отличительной чертой этой фразы является эта реализация . Вы увидите это в классах как
JTable
иJInternalFrame
. Это одна мера наследования по дизайну в Swing.источник
Начиная с C # 3.5, у нас есть понятие, называемое «Методы расширения», которое допускает концепцию композиции, а не наследования.
В этом процессе мы реализуем расширенную функциональность для существующего класса, просто добавляя класс расширения, который отображает новую функцию в существующем классе.
Вы можете обратиться сюда для более подробной информации
источник