Почему бы вам не расширить JFrame и другие компоненты? - PullRequest
25 голосов
/ 17 июля 2009

Я видел, как это появлялось здесь несколько раз, но в сообщениях, которые я видел, никто не объяснил это. Почему я не должен расширять JFrame (или любой другой компонент)? Есть ли условия, в которых я должен расширять компонент, или это строгое правило, которого вы не делаете?

Ответы [ 5 ]

23 голосов
/ 17 июля 2009

Вообще говоря, расширение компонента обычно делается строго для его использования. Это сильно ограничивает ваши параметры ненужными способами с точки зрения дизайна, так что ваши классы не могут расширять разные классы, вы не можете скрыть методы JFrame, что делает его более трудным для обслуживания и легче вызывать неожиданные ошибки при использовании класса .

Обычно намерение состоит в том, чтобы строго использовать класс для рисования рамки, а композиция предпочтительнее наследования.

С другой стороны, подклассы должны быть хорошими, когда вы намерены подклассом добавить функциональность, специфичную для проекта, во фрейм (например, удобные методы и т. П.), Где подкласс будет использоваться вместо самого фрейма, но использоваться как кадр в целом, а не как вид конкретного кадра в приложении.

9 голосов
/ 17 июля 2009

Предпочитаю композицию наследованию. Все обычные причины. Композиция вынуждает меньше зависимостей между кодом.

Компоненты Swing и Event AWT ужасно сложны. Вы не хотите быть в этом беспорядке. Вы можете легко переопределить методы случайно. В тех случаях, когда вам необходимо переопределить методы, трудно понять, где это делается, если он находится среди нормального кода.

4 голосов
/ 17 июля 2009

Если ваше приложение действительно является JFrame, продолжайте и расширяйте его. Однако лучше использовать композицию объектов, а не наследование, если вы просто используете JFrame.

Если ваш объект расширяет какой-то другой объект, у вас не будет выбора в этом вопросе, например.

2 голосов
/ 17 июля 2009

Я не вижу проблемы, пока вы расширяете класс и можете сохранить аспекты наследования "is-a".

Когда вы расширяете JPanel, но ваш новый объект не является истинной специализацией JPanel, именно здесь вы попадаете в беду. Но если вы создадите новый SpeciallyFormattedJLabel, который расширяет JLabel, я не вижу проблем с этим.

0 голосов
/ 01 июня 2013

Я знаю, что это старый пост, но я только что натолкнулся на него и должен сказать вам ... расширение ограничило мои возможности вызова определенных действий объекта. Сейчас я переписываю некоторые части кода, чтобы избавиться от нанесенного мне ущерба. Если я не пишу однофайловую программу, я не собираюсь снова использовать расширенный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...