Абстрактные классы рекомендуется использовать в следующих ситуациях:
- Нужно определить общий функционал для родственных объектов. metanit.com
- Необходимо спроектировать большую функциональную единицу, которая содержит много базового функционала. metanit.com
- Нужно, чтобы все производные классы на всех уровнях наследования имели некоторую общую реализацию. metanit.com
- Проект уже частично написан, и известно, что выбранные классы будут часто меняться и дополняться новыми методами и полями. skillbox.ru
Интерфейсы лучше использовать в таких ситуациях:
- Нужно описать определённую логику, которую должны поддерживать не связанные между собой объекты. skillbox.ru
- Необходимо привести к одному типу группу объектов и гарантировать схожую функциональность. skillbox.ru
- Нужно добавить какой-то маркер, который будет говорить о том, что выбранные классы поддерживают определённую логику. skillbox.ru
- Необходимо использовать множественное наследование типа. skillbox.ru
Таким образом, принцип выбора между абстрактными классами и интерфейсами: если классы относятся к единой системе классификации, то выбирается абстрактный класс, иначе — интерфейс. metanit.com