Главная » Java, Структуры данных и алгоритмы » Множественное наследование интерфейсов

0

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

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

практически ничем не отличается от механизма множественного наследования под названием mixin. В отличие от Java, в некоторых объектно-ориентированных языках программирования, таких как Smalltalk или С++, разрешено множественное наследование определенных классов, а не только интерфейсов. В таких языках описываются классы типа mixin, которые не содержат самостоятельных объектов и используются лишь для расширения функциональных возможностей существующих классов. Другими словами, класс «mixin» добавляет новые методы, которые расширяют возможности существующего класса. Однако подобный тип наследования классов не разрешен в Java, и поэтому приходится решать те же задачи с помощью интерфейсов. В частности, можно использовать свойство множественного наследования интерфейсов как механизм объединения методов двух или более несвязанных интерфейсов для описания нового интерфейса, который сочетает в себе их функции, а также может содержать свои собственные методы. Возвращаясь к примеру с антиквариатом, можно описать класс предметов, которые можно страховать, следующим образом:

public interface Insurableltem extends Transportable, Sellable {

public int insuredValue(); // Возвращает сумму страховки в центах

}

Данный интерфейс сочетает методы интерфейса Transportable и методы интерфейса Sellable, а также содержит дополнительный метод insured- Value. Подобный интерфейс позволяет описать класс Boxedltem:

public class Boxedltem implements Insurableltem {

// далее код повторяется, как в предыдущем примере

}

Следует отметить, что в данном случае метод insuredValue является обязательным, в отличие от предыдущего примера.

Интерфейсами, имитирующими mixin, являются: java.lang.Cloneable, добавляющий в класс возможность создания его копий, java.lang.Comparable, сравнивающий (и упорядочивающий) экземпляры класса естественным образом, й java.util.Observer, обновляющий класс, которому необходимо уведомление об изменении внутреннего состояния некоторых «наблюдаемых» объектов.

Источник: Гудрич М.Т. Г93 Структуры данных и алгоритмы в Java / М.Т. Гудрич, Р. Тамассия; Пер. с англ. A.M. Чернухо. — Мн.: Новое знание, 2003. — 671 е.: ил.

По теме:

  • Комментарии