Я читаю книгу - Hadoop: Полное руководство
В главе 2 (Страница 25) это упоминается "Новый абстрактный класс пользы API по интерфейсам, так как их легче развить. Например, можно добавить метод (с реализацией по умолчанию) к абстрактному классу, не повреждая старые реализации класса". Что означает (особенно, что означает "повреждать старые реализации класса")? Цените, если кто-либо мог бы показать мне образец, почему с этой точки зрения абстрактный класс лучше, чем интерфейс?
заранее спасибо, George
В случае интерфейса, все методы, которые определены в интерфейсе должны быть реализованы классом, который его реализует.
Учитывая интерфейс 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, который все еще развивается и на нем уже много чего построено.
При добавлении метода с реализацией по умолчанию в абстрактный класс ничего не нужно менять в производных классах.
Кроме того, если вы добавляете метод в интерфейс, любые классы, реализующие этот интерфейс, должны реализовать метод - в противном случае они не будут компилироваться.