объектно-ориентированное программирование Интерфейс определяет контракт — набор методов без реализации Абстрактный класс способен хранить состояние и содержать реализованные методы Класс может реализовать несколько интерфейсов, но, как правило, наследуется только от одного абстрактного класса Интерфейс предоставляет полную абстракцию, тогда как абстрактный класс — частичную Интерфейсы используют для гибкого полиморфизма и расширения системы Абстрактные классы подходят для шаблонного проектирования и повторного использования общего кода
В чём разница между интерфейсом и абстрактным классом?
объектно-ориентированное программирование Интерфейс определяет контракт — набор методов без реализации Абстрактный класс способен хранить состояние и содержать реализованные методы Класс может реализовать несколько…
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
В чём разница между интерфейсом и абстрактным классом?
- объектно-ориентированное программирование
- Интерфейс определяет контракт — набор методов без реализации
- Абстрактный класс способен хранить состояние и содержать реализованные методы
- Класс может реализовать несколько интерфейсов, но, как правило, наследуется только от одного абстрактного класса
- Интерфейс предоставляет полную абстракцию, тогда как абстрактный класс — частичную
- Интерфейсы используют для гибкого полиморфизма и расширения системы
- Абстрактные классы подходят для шаблонного проектирования и повторного использования общего кода
Подробный ответ
Основной ответ
Интерфейс представляет собой контракт: он описывает методы, которые обязан реализовать класс, но сам не содержит их реализации. Абстрактный класс может объединять абстрактные методы без реализации и обычные методы с готовой логикой, выступая общей основой для производных классов.
Ключевые моменты
- Множественное наследование: В большинстве языков, включая Java и C#, класс способен реализовать несколько интерфейсов, однако унаследовать его можно только от одного абстрактного класса. Поэтому интерфейсы удобны, когда требуется объединить несколько независимых контрактов.
- Реализация по умолчанию: Абстрактный класс может включать общую бизнес-логику и хранить состояние в полях. Традиционно интерфейс содержал только объявления методов и константы. В Java 8+ появились default методы, но хранить состояние в полях интерфейсы по-прежнему не позволяют.
- Назначение: Интерфейс отвечает на вопрос, “что” должен делать класс, то есть описывает требуемую функциональность. Абстрактный класс показывает, “как” эту функциональность можно частично реализовать и предоставить наследникам общую основу.
Практический контекст
В прикладных системах интерфейсы часто задают контракты API и сервисов, например в Spring или ASP.NET, благодаря чему компоненты остаются слабо связанными. Абстрактные классы выбирают в ситуациях, когда нескольким связанным классам требуется общий базовый функционал, например при создании абстракции базового контроллера или репозитория.