@Urukhayy

В каком случае лучше использовать абстрактный класс, а в каком интерфейсы?

Приведите пример, в каком случае лучше использовать абстрактный класс, а в каком интерфейсы?
Ведь одну и ту же задачу можно осуществить как через интерфейсы, так и через абстрактный класс.
  • Вопрос задан
  • 6246 просмотров
Решения вопроса 1
@gbondarchuk
Software Engineer
Just wanted to summarize previous answers:

Интерфейс - это просто список методов, то есть в нем мы определяем что будут делать наши методы. Как черный ящик: отдаем входные данные и получаем результат, абстрагируясь от того, как будет получен результат.
Обычный класс (реализация интерфейса) - здесь мы определяем как будут работать наши методы.
Абстрактный класс - часть методов абстрактные, т.к. мы не может определить на данном этапе как они будут выполняться, другая часть - обычные методы. Используется в следующих ситуациях:
Пусть у нас есть интерфейс и несколько его реализаций (обычных классов): в интерфейсе будет описан метод для вычисления определенного интеграла Римана а также метод для определения точности результата. Реализаций несколько: метод прямоугольников, метод трапеций, метод Монте-Карло. Создадим 3 обычных класса для 3-х методов, унаследуем эти класса от интерфейса. После реализации можно заметить, что метод для определения точности результата дублируется во всех 3-х классах, следовательно он может быть вынесен на предыдущий уровень иерархии: создаем абстрактный класс унаследованный от нашего интерфейса, реализуем в нем второй метод, а первый оставляем не реализованным (абстрактным). При добавлении нового метода вычисления нам уже не нужно беспокоиться о реализации метода определения точности результата.

Также используется для предотвращения создания объектов данного типа. Если класс объявлен как абстрактный мы не можем создать объект new AbstractClass();

Таким образом абстрактный класс является прослойкой в иерархии между выше стоящим интерфейсом и ниже стоящими реализациями.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
valerium
@valerium
Изобретая велосипед
Абстрактный класс реализует часть своих методов, а часть требует реализовать у потомков. Интерфейс же не делает вообще ничего, вся логика целиком перекладывается на плечи потомков.

UPD. Интерфейсы, имхо, удобно использовать для описания шлюзов. То есть приложение получает данные из разрозненных источников в самых разных форматах, и не хочет об этих форматах ничего знать. А абстрактные классы хороши для описания родственных сущность, например, организации с различной формой собственности (им всем потребуется метод для валидации ИНН и запроса адреса регистрации с сайта налоговой). Но вообще, повторюсь, грань тонка.
Ответ написан
@Barmunk
Интерфейс нужно создавать, если ты архитектор, и в дальнейшем остальные работники будут наследовать свои классы только от этого интерфейса/ов. Тем самым ты можешь рулить масштабированием всего проекта.

Абстрактные классы, это больше частный случай, который идет ниже по иерархии.
Ответ написан
Комментировать
Если необходимо задать тип объекта, то необходимо использовать абстрактный класс. А если необходимо задать поведение объекту, то следует использовать интерфейс.
Ответ написан
Комментировать
pazukdev
@pazukdev
Java Dev
Вопрос был бы острее, если бы спрашивали про полностью абстрактный класс vs интерфейс.
Если не вдаваться в подробности, полностью абстрактный класс может иметь состояние, а интерфейс - нет. Отсюда вытекает использование: если у наследников должно быть общее описание состояния - использовать абстрактный класс, во всех других случаях - интерфейс.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы