Rambler's Top100


Объектно-ориентированное программирование (Учебное пособие). Автор: Шахгельдян К.И. , редактор: Александрова Л.И.

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

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

class Date implements Store, Display { }

Хотя классы и не наследуются от нескольких классов, но интерфейсы могут это делать. Например, мы определим интерфейс для манипулирования с данными.

interface DateEdit extends Store, Display { }

В Java, как и в С++, возможет конфликт имен, связанный с использованием в интерфейсах, от которых наследуется другой интерфейс, одинаковых имен переменных.

interface A {    int x = 4;         }

interface B {   int x = 43;       }

interface C extends A, B {

int y = 22;

int w = ((A)this).x;

}

class Z implements C {

public static void main (String[] argv) {

System.out.println(x); // двусмысленность

System.out.println(A.x); // верно

}

}

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

interface A {   int x = 4; }

interface B {   int x = 43;      }

class Z implements A, B {

public static void main (String[] argv) {

System.out.println(x); // двусмысленность

System.out.println(B.x); // верно

}

}

Подробнее с множественным наследованием в Java вы можете познакомиться в [6-8].

Советы

1.  Пользуйтесь множественным наследованием, чтобы выразить объединение свойств.

2.  Пользуйтесь множественным наследованием в С++, чтобы отделить детали реализации от интерфейса. В Java для этой цели используйте интерфейсы.

3.  Используйте виртуальные базовые классы для выражения некоторой общности.

4.  Не вызывайте виртуальных функций в процессе создания и уничтожения объекта.

Упражнения для самопроверки

1.  Все объектно-ориентированные языки поддерживают механизм множественного наследования.

2.  В Java разрешено только одиночное наследование, но можно реализовать несколько интерфейсов.

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

4.  Виртуальный базовый класс всегда инициализируется первым.

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

Задания

1.  Укажите различия одиночного и множественного наследования.

2.  Приведите пример, когда трудно обойтись без множественного наследования.

3.  Напишите программу, которая иллюстрирует влияние последовательности вызовов конструкторов на состояние объекта.

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

Литература

1.  Страуструп Б. Язык программирования С++. 3-е изд. М.: Бином, с. 444-456.

2.  Дейтел Х.М., Дейтел П.Дж.. Как программировать на С++. М.: Бином, 1998. с. 582-586.

3.  Шилдт Г. Самоучитель С++. СПб.: bhv 1997, с. 208-220.

4.  Пол И. Объектно-ориентированное программирование с использованием С++. Киев: Диасофт, 1995. с. 292-295.

5.    Бадд Т. Объектно-ориентированное программирование в действии. М.: Бином, 1997. Гл. 13.

6.  Flangan D. Java in Nutshell. O'Reilly. 1997. Ch. 3.7, 3.9.

7.  Grand D. Java language reference. O'Reilly. 1997. Ch. 5.4, 5.5.

8.  Niemeyer P., Peck J. Exploring Java. O'Reilly. 1997. Ch. 5.8.

Poker razz odds calculator