В учебниках написано, что интерфейсы нужны для полиморфизма. Иногда, что интерфейсы обеспечивают инкапсуляцию.
Верно ли это?
Не для полиморфизма
Полиморфизм возможен с абстрактными классами и даже не абстрактными, через наследование.
Интерфейсы не обязательны для полиморфизма.
Не для инкапсуляции
Мы можем спрятать всю нутрянку за фасадом или выставить наружу только часть методов, благодаря разделению на приватные и публичные методы.
Интерфейсы не обязательны для инкапсуляции.
Архитектурные границы
Интерфейс нужен для защиты модуля. Для проведения архитектурных границ.
Мы ставим интерфейсы на границах защищаемой системы. Интерфейс это гарантия что остальные части системы не будут знать о внутренностях модуля.
Преимущества архитектурных границ
Во-первых внутри модуля реализующего интерфейс мы свободны менять код как угодно, заботясь лишь о том чтобы выполнялся контракт интерфейса.
Возлагая на интерфейс заботу о совместимости, внутри модуля мы можем не думать о совместимости и потому работаем гораздо быстрее.
Во-вторых, механизм интерфейсов даëт удобство в применении DIP из SOLID.
Применяя DIP мы строим более устойчивую систему, в которой не абстракции зависят от деталей, а наоборот — детали зависят от абстракций. Благодаря этому система меньше ломается при изменениях.