2011-01-04 10 views
2

У меня есть класс Journey, который я хочу сделать суперклассом и другим классом плановым путешествием. Запланированный класс Journey расширяет JFrame, так как он содержит формы. Однако я также хочу, чтобы этот класс расширил Journey.Java: Может ли класс наследовать от двух супер-классов одновременно?

Есть ли способ сделать это?

+3

нет. в java нет множественного наследования. Проверьте http://stackoverflow.com/questions/3621290/java-multiple-inheritance, http://stackoverflow.com/questions/1038314/alternative-of-multiple-inheritance-in-java, http://stackoverflow.com/questions/3448864/how-does-multiple-inheritance-in-java-work – Bozho

+6

Подкласс из компонентов Swing редко бывает хорошей идеей. Эти классы уже очень велики. Лучше использовать композицию (ваш класс будет иметь ссылку на фрейм). –

+0

довольно много ответов за несколько секунд, которые вы могли бы избежать, посмотрев немного больше в уже существующих вопросах (и ответы!) :) – LudoMC

ответ

3

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

У вас есть один модельный класс для путешествий и зритель для таких поездок. Зритель должен подкласса 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 в соответствующем положении.

2

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

+1

Это всегда возможно, это не всегда лучшее решение :) –

+0

Да, это то, что я имел в виду, поскольку иногда, даже если это возможно, лучше подумать дважды о дизайне и изменить его вместо того, чтобы что-то переделать в обратном порядке. – LudoMC

1

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

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

2

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

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

2

С Inheritance страницы Sun Java Tutorial

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

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

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

1

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

2

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

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

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

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


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

+0

Я не проголосовал за это, потому что последний абзац, который является разумным советом, противоречит первой части. «Оплатить композицию над наследованием». – DJClayworth

+0

Первая часть ответила на вопрос: «Может ли класс наследовать от двух супер-классов одновременно?» Я считаю, что важно ответить на вопрос. Вторая часть - совет здравого смысла о конкретном примере, который цитируется. Я также не подписываюсь на общие заявления, такие как «поддержка композиции над наследованием». Я всегда буду одобрять то, что имеет смысл над тем, чего нет. –

1

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

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

Если возможно, пользуйтесь композицией над наследованием. Цитата взята из эффективной Java.

1

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

0

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

+0

Множественное наследование означает возможность наличия более чем одного прямого суперкласса. В Java нет такой вещи. –

Смежные вопросы