Java: Может ли класс наследовать от двух суперклассов одновременно? - PullRequest
3 голосов
/ 04 января 2011

У меня есть класс Journey, который я хочу сделать суперклассом, и еще один запланированный класс.Класс запланированного путешествия расширяет JFrame, поскольку он содержит формы. Однако я также хочу, чтобы этот класс расширял Journey.

Есть ли возможный способ сделать это?

Ответы [ 10 ]

4 голосов
/ 04 января 2011

Не смешивайте модели и виды.Если вы храните оба домена четко разделенными, вам не понадобится множественное наследование (на этот раз).

У вас есть один класс моделей для поездок и средство просмотра для таких поездок.Зритель должен иметь подкласс Component и отображаться (где-то) в вашем окне (экземпляр JFrame).

Этот вьюер берет один объект путешествия и представляет его свойства.Только Journey содержит всю информацию о путешествии, только зритель знает, как представить путешествие пользователю:

 public class PlannedJourney extends JPanel {
   private Journey journey;
   public JourneyViewer(Journey journey) {
     this.journey = journey;

     // build this panel based on the journey object
     // (add labels, subpanels, widgets, ...)
   }
 }

Теперь вы можете создать экземпляр PlannedJourney и добавить его в приложения JFrameв соответствующей позиции.

3 голосов
/ 04 января 2011

Нет множественного наследования в Java. Это не разрешено языком. Проверьте, можете ли вы изменить свой дизайн, чтобы использовать интерфейс вместо этого. (это почти всегда возможно).

2 голосов
/ 04 января 2011

Либо сделайте Journey продление JFrame, либо сделайте Journey интерфейсом.

Выберите вариант, наиболее подходящий для вашей структуры объекта.

Если имеет смысл для Journey расширить JFrame, тогда сделайте это.Таким образом, когда PlannedJourney расширяет Journey, он также наследует все, что Journey делает от JFrame.

Если это не имеет смысла, тогда сделайте Journey интерфейсом и получитеPlannedJourney агрегат Journey.PlannedJourney не сможет наследовать какой-либо код от Journey, но вы сможете наследовать сигнатуры методов и передавать объект как Journey в дополнение к JFrame.


Убедитесь, что при работе с Swing вы отделяете модель от View .Ваши данные должны храниться в одном наборе объектов ( Модель ), а компоненты Swing для отображения этих данных должны быть отдельным набором объектов ( View ).Это помогает инкапсулировать функции данных, отделять их от объектов графического интерфейса и обеспечивать одностороннюю зависимость View от Model .Учтите, что объект Journey, возможно, должен отображать JourneyFrame.Таким образом, JourneyFrame может позаботиться о его отображении, может расширить JFrame и содержать только ссылку на Journey, которая может иметь свою собственную иерархию.

2 голосов
/ 04 января 2011

Со страницы Наследование учебника Sun Java

Определения: класс, которыйПроизводный от другого класса называется подклассом (также производным классом, расширенным классом или дочерним классом).Класс, из которого происходит подкласс, называется суперклассом (также базовым классом или родительским классом).

Исключая объект, у которого нет суперкласса, каждый класс имеет один и только один прямой суперкласс (одиночное наследство) .В отсутствие какого-либо другого явного суперкласса каждый класс неявно является подклассом Object.

Классы могут быть получены из классов, которые являются производными от классов, которые являются производными от классов, и так далее, и, в конечном счете, получены изВысший класс, Объект.Говорят, что такой класс происходит от всех классов в цепочке наследования, простирающейся до Object.

2 голосов
/ 04 января 2011

Нет, это невозможно с Java. Обычно подобный эффект может быть достигнут с помощью интерфейсов (я думаю, что здесь может быть интерфейс Journey), хотя, если вы хотите наследовать реализации методов, вам придется переосмыслить свой дизайн.

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

1 голос
/ 04 января 2011

Если вы еще не читали «Эффективную Java» Джошуа Блоха, сейчас самое время это сделать. В частности, раздел «отдать предпочтение композиции, а не наследованию». Поскольку вы не можете выполнять множественное наследование в Java, он объясняет, почему почти во всех случаях правильный подход состоит в том, чтобы ваше расширение JFrame содержало ссылку на PlannedJourney, для которого он предназначен.

1 голос
/ 04 января 2011

Множественное наследование в Java невозможно.

Возможно несколько реализаций интерфейсов, это самое близкое к множественному наследованию в Java.

Если возможно, отдавайте предпочтение композиции, а не наследованию. Цитата взята из Эффективной Java.

1 голос
/ 04 января 2011

Я думаю, что лучшим способом было бы, чтобы PlannedJourney продлил Journey, а затем PlannedJourney имел экземпляр JFrame. Это похоже на способ убить двух зайцев одним выстрелом в зависимости от того, как вы их видите.

1 голос
/ 04 января 2011

Нет.В Java нет множественного наследования.Это было обдуманное дизайнерское решение.

Если вы можете найти способ выразить один из суперклассов как интерфейс, то это может решить вашу проблему.

0 голосов
/ 21 мая 2013

Не совсем уверен, что вы хотите, но множественное наследование является очень возможным и распространенным явлением в Java. Во-первых, когда класс наследует от другого класса, если этот класс также является подклассом другого класса, он передает свои унаследованные методы своим подклассам. Во-вторых, в Java есть строка кодирования, иначе известная как «Интерфейс», это позволяет классу наследовать от нескольких классов без расширения класса.

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