Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие Java.doc
Скачиваний:
17
Добавлен:
07.09.2019
Размер:
569.34 Кб
Скачать

Частичные реализации

Как отмечалось выше, если класс, реализующий интерфейс, реализует не все методы этого интерфейса, то этот класс должен быть объявлен как абстрактный (abstract). Например:

ПРИМЕР

“Множественное” наследование в Java

Интерфейс, это не просто одна из форм абстрактного класса. В Java можно реализовать наследование «от многих», но только один из этих классов может иметь реализацию, так что проблемы, возникающие в C++, не возникают в Java, при комбинировании множества интерфейсов.

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

interface Intrf_A {

void fun_A();

}

interface Intrf_B {

void fun_B();

}

interface Intrf_C {

void fun_C();

}

class A {

public void fun_A () {}

}

class B extends A implements Intrf_A, Intrf_B, Intrf_C {

public void fun_B () {}

public void fun_C () {}

}

public class D {

static void t(Intrf_A x) { x. fun_A (); }

static void u(Intrf_B x) { x. fun_B (); }

static void v(Intrf_C x) { x. fun_C (); }

static void w(A x) { x. fun_A (); }

public static void main(String[] args) {

B h = new B();

t(h); // Treat - CanFight

u(h); // Treat - CanSwim

v(h); // Treat - CanFly

w(h); // Treat - ActionCharacter

}

} ///:~

В этом примере, класс B комбинирует конкретный класс A с интерфейсами Intrf_A, Intrf_B и Intrf_C. При этом класс должен быть указан первым, а только затем интерфейсы, в противном случае компилятор выдаст сообщение об ошибке.

Заметим, что сигнатура fun_A() одинаковая и в интерфейсе Intrf_A и в классе A, но fun_A() не определена в В. От интерфейса можно наследовать, но тогда получается еще один интерфейс. Для создания же класса на основе интерфейса он должен иметь все определения. И хотя класс В не предоставляет определения для fun_A(), это определение появляется автоматически вместе с классом А и создать объект от класса В становится возможным.

В классе D есть несколько методов, которые воспринимают в качестве аргументов различные интерфейсы и конкретные классы. Когда объект класса В уже создан, он может быть передан в качестве параметра в любой их этих методов, что в свою очередь означает, что он может быть приведен к базовому типу (к любому из вышеописанных интерфейсов).

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