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