Ситуация, когда и интерфейс, и ABC имеют смысл, - это использование шаблона декоратора. ABC используется для предоставления общего кода реализации для различных конкретных классов реализации. Все классы реализации, вероятно, являются производными от ABC.
Декоратор, который упаковывает существующий экземпляр и настраивает его функциональность, обычно реализует только интерфейс, а не наследуется от ABC. Если имеется много декораторов, может быть другой ABC, который обеспечивает общую обработку композиции и переадресацию вызовов функций, которые нужны декораторам.
Явное упоминание интерфейса иногда делает его более читабельным. Документация MSDN часто делает это, например, показывая, что List<>
реализует как ICollection<>
, так и IList<>
, хотя IList<>
является производным от ICollection<>
.