Как решить проблему множественного наследования в Java

kak reshit problemu mnozhestvennogo nasledovaniya v java

Java является одним из самых популярных языков объектно-ориентированного программирования, используемого сегодня.

Поскольку он не зависит от платформы, вы найдете приложения Java на каждом типе устройств и каждой операционной системе. И поскольку Java относительно легко изучить, это один из первых языков, на который овладеют многие программисты.

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

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

Java отклоняет множественные связи наследования, поскольку они создают неоднозначность, но есть несколько способов достичь многих из тех же эффектов, если вы знаете, что делать.

В этой статье мы рассмотрим проблемы с множественным наследованием и обсудим альтернативные варианты кодирования в Java.

Терминология наследования

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

Одна из таких проблем касается множественного наследования (точнее, его отсутствия) в Java.

изображение-73
Источник изображения

Чтобы полностью понять наследование в Java, необходимо ознакомиться с базовой терминологией наследования объектно-ориентированного программирования (ООП).

  • класс: Классы представляют собой фундаментальную структуру шаблонов в объектно-ориентированных языках программирования. Класс определяет общие свойства группы объектов.
  • Родительский класс: Также известен как базовые классы или суперклассы, родительский класс – это расширяющийся класс, предоставляющий функции дочернему классу. Вот здесь и вступает в игру возможность повторного использования. Определения и функции родительского класса используются при создании дочерних классов.
  • Детский класс: В общей форме подклассом дочерний класс наследует признаки другого класса. Дочерние классы являются расширенными или производными классами.
  • наследование: Отношения между родительскими и дочерними классами.

Типы наследования ООП

Сегодня используется многие популярные объектно-ориентированные языки программирования, включая Java, C++, JavaScript, Python, PHP, Ruby и Perl. Хотя наследование является общей концепцией в этих языках ООП, все типы наследования существуют в каждом языке.

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

Типы наследования, поддерживаемые Java:

  • Одноуровневое наследование: Когда дочерний класс получает функции от одного родительского класса.
  • Многоуровневое наследование: Это многоуровневая форма одноуровневого наследования. При многоуровневом подражании дочерний класс также может действовать как родительский класс для других дочерних классов. Отношение между каждым уровнем является линейным – ни одна из ветвей не простирается выше, как при множественном подражании. Таким образом, окончательный дочерний класс имеет функции по всем уровням выше.
  • Иерархическое наследование: Противоположность множественного наследования. При иерархическом подражании один родительский класс имеет более одного дочернего класса. Поэтому вместо того чтобы иметь ветви над ним, он разветвляется ниже.
  • Гибридная наследственность: Как следует из названия, гибридное наследование является сочетанием других типов наследования.

Кроме вышеприведенных типов наследования, есть и другие типы, которые Java не поддерживает.

  • Множественное наследование: При множественном подражании дочерний класс имеет более одного родительского класса. Хотя Java и JavaScript не поддерживают множественное наследование, языки ООП, такие как C++, поддерживают.
  • Многопутевое наследование: Гибрид множественного, многоуровневого и иерархического наследования при многопутном наследовании дочерний класс получает свои функции и функции от родительского класса и нескольких дочерних классов родительского класса. Поскольку многопутное подражание зависит от множественного наследования, Java не поддерживает его использование.

Почему Java не поддерживает множественное наследование

Основная проблема множественного наследования в том, что оно может создавать неоднозначность в дочерних классах. В обзорном документе 1995 г. ведущий дизайнер Java Джеймс Гослинг заявил, что проблемы с множественным наследованием были одной из мотиваций для создания Java.

Затруднения, присущие множественному наследованию, наиболее ярко прослеживаются в проблеме алмазов. В задаче с бриллиантами родительский класс A имеет два разных дочерних класса B и C; то есть, дочерние классы B и C расширяют класс A.

изображение-74
Источник изображения

Теперь мы создаем новый дочерний класс D, который расширяет как класс B, так и класс C. Обратите внимание, что у нас есть множественное наследование (D расширяет B и C), иерархическое наследование (B и C расширяет A) и многоуровневое наследование (D расширяет A, B и C).

В проблеме бриллианта дочерние классы B и C наследуют метод от родительского класса A. И B, и C заменяют унаследованный метод. Но новые методы в B и C конфликтуют друг с другом.

Ultimate дочерний класс D наследует два независимых и конфликтующих метода от многочисленных родителей B и C. Неясно, какой метод класса D должен использовать, поэтому существует неоднозначность. Другие языки программирования ООП реализуют разные методы для решения неоднозначности множественного наследования.

Как решить проблему множественного наследования в Java

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

Просто подумайте о Tesla Roadster, который вы приобретете, когда станете очень успешным разработчиком программного обеспечения. Он будет черпать характеристики как из класса спортивных автомобилей, так и класса электромобилей.

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

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

Ну он использует структуры, которые называются интерфейсами. Интерфейсы – это абстрактные типы, определяющие поведение классов для реализации. Поскольку они абстрактны, интерфейсы не содержат подробных инструкций по их поведению. Вместо этого классы предоставляют конкретные реализации поведения интерфейса.

Интерфейсы имеют несколько определяющих характеристик:

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

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

То, что раньше были классами A, B и C, теперь становятся интерфейсами A, B и C. Интерфейсы B и C все еще расширяют интерфейс A, но ни в одном из этих интерфейсов нет конкретных функций, только определенное поведение. Класс D остается классом, отвечающим за конкретную реализацию поведения в интерфейсах B и C.

Обратите внимание на одно ключевое отличие: класс D не расширяет интерфейсы B и C. Вместо этого он реализует их. Таким образом, вы на самом деле не имеете множественного наследия. Вы просто переопределили проблему.

Вывод

Понимание наследования необходимо для любого эффективного кодера. Для программистов Java не менее важно знать ограничения наследования и встроенный обходной путь Java для традиционных проблем с множественным наследованием.

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

Добавить комментарий

Ваш адрес email не будет опубликован.