Интерфейс Java и проблема абстрактного класса

Я читаю книгу - Hadoop: Полное руководство

В главе 2 (Страница 25) это упоминается "Новый абстрактный класс пользы API по интерфейсам, так как их легче развить. Например, можно добавить метод (с реализацией по умолчанию) к абстрактному классу, не повреждая старые реализации класса". Что означает (особенно, что означает "повреждать старые реализации класса")? Цените, если кто-либо мог бы показать мне образец, почему с этой точки зрения абстрактный класс лучше, чем интерфейс?

заранее спасибо, George

7
задан Roman 15 May 2010 в 14:40
поделиться

2 ответа

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

Учитывая интерфейс A

interface A {
    public void foo();
}

и класс B:

class B implements A {
}

он должен обеспечить реализацию метода, определенного в интерфейсе:

class B implements A {
    @Override
    public void foo() {
        System.out.println("foo");
    }
}

Иначе это ошибка компиляции. Теперь возьмем абстрактный класс с реализацией метода по умолчанию:

abstract class C {
    public void bar() {
        System.out.println("bar");
    }
}

где класс, наследующий от этого абстрактного класса, может выглядеть так:

class D extends C { }

без ошибки. Но он также может переопределить реализацию метода по умолчанию, если захочет это сделать.

Что автор хотел этим сказать: Если ваш API еще не стабилен, и вам нужно адаптировать интерфейсы (да, абстрактные классы - это тоже интерфейсы (в ООП-слове)), то абстрактный класс позволяет вам добавлять вещи, не ломая уже существующие классы. Однако это справедливо только для неабстрактных методов. Если вы добавляете абстрактные методы, то они все равно должны быть реализованы в каждом производном классе. Но все же, это может облегчить вам жизнь, если у вас есть API, который все еще развивается и на нем уже много чего построено.

10
ответ дан 6 December 2019 в 11:46
поделиться

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

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

6
ответ дан 6 December 2019 в 11:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: