Неверное сравнение интерфейса с абстрактным классом. Вместо этого должно быть два других сравнения: 1) интерфейс против класса и 2) аннотация против финального класса .
Интерфейс против класса
Интерфейс - это контракт между двумя объектами. Например, я почтальон, а ты посылка для доставки. Я ожидаю, что вы знаете свой адрес доставки. Когда кто-то дает мне посылку, он должен знать ее адрес доставки:
interface Package {
String address();
}
Класс - это группа объектов, которые подчиняются договору. Например, я ящик из группы "Ящик" и подчиняюсь договору, требуемому Почтальоном. В то же время я подчиняюсь другим контрактам:
class Box implements Package, Property {
@Override
String address() {
return "5th Street, New York, NY";
}
@Override
Human owner() {
// this method is part of another contract
}
}
Аннотация против финала
Абстрактный класс - группа незавершенных объектов. Их нельзя использовать, потому что они пропускают некоторые части. Например, я - абстрактное поле с поддержкой GPS - я знаю, как проверить свое положение на карте:
abstract class GpsBox implements Package {
@Override
public abstract String address();
protected Coordinates whereAmI() {
// connect to GPS and return my current position
}
}
Этот класс, если он унаследован / расширен другим классом, может быть очень полезным. Но само по себе - это бесполезно, так как не может иметь объектов. Абстрактные классы могут быть элементами построения конечных классов.
Финальный класс - это группа законченных объектов, которые можно использовать, но нельзя изменить. Они точно знают, как работать и что делать. Например, я ящик, который всегда идет по адресу, указанному при его создании:
final class DirectBox implements Package {
private final String to;
public DirectBox(String addr) {
this.to = addr;
}
@Override
public String address() {
return this.to;
}
}
В большинстве языков, таких как Java или C ++, может иметь только класс , ни абстрактный, ни окончательный. Такой класс может быть унаследован и может быть создан. Я не думаю, что это строго соответствует объектно-ориентированной парадигме.
Опять же, сравнение интерфейсов с абстрактными классами некорректно.