Вопрос проверяет понимание объектно-ориентированного проектирования и умение выбирать правильный инструмент для проектирования API.
Интерфейс используют, когда нужно задать контракт без хранения состояния.
Абстрактный класс применяют, когда есть общая логика и состояние, которое нужно переиспользовать.
Интерфейсы позволяют множественную реализацию, а абстрактные классы — нет.
Выбор зависит от того, нужен ли общий код и ограничения иерархии.
Выбор между интерфейсом и абстрактным классом влияет на гибкость архитектуры и расширяемость системы.
Интерфейс — это контракт, который описывает, какие методы должен реализовать класс, не навязывая реализацию и состояние.
Интерфейс подходит, если:
Нужно определить поведение без реализации
Класс должен реализовывать несколько контрактов
Важна слабая связанность компонентов
Пример интерфейса:
public interface PaymentService {
void pay(int amount);
}
Абстрактный класс — это базовый класс, который может содержать как абстрактные методы, так и готовую реализацию.
Абстрактный класс подходит, если:
Есть общая логика для всех наследников
Нужно хранить состояние
Допустима жесткая иерархия наследования
Пример абстрактного класса:
public abstract class BasePaymentService {
protected int commission;
public abstract void pay(int amount);
protected int calculateCommission(int amount) {
return amount * commission / 100;
}
}
При проектировании важно учитывать:
Наследование
Интерфейсов может быть несколько
Абстрактный класс — только один
Состояние
Интерфейс не хранит состояние
Абстрактный класс может
Гибкость архитектуры
Интерфейсы лучше подходят для API и контрактов
Абстрактные классы — для общего поведения
Интерфейс выбирают для описания поведения и гибкости.
Абстрактный класс — для переиспользования логики и состояния внутри иерархии.