Программирование на интерфейсах является основным принципом ОО. Он позволяет вам встроить Dependency inversion/inversion of control
- т.е. реализации не зависят напрямую от других реализаций - вместо этого они зависят от других типов . Это облегчает подключение / отключение частей вашей системы. Это также повышает тестируемость системы, поскольку ее легко обеспечить макетами, соответствующими интерфейсу, если вся ваша реализация заботится о интерфейсе.
Кроме того, наличие системы, описанной в терминах нескольких интерфейсов, также облегчает понимание общих политик системы. Попытка предугадать это из набора базовых классов, в которых есть детали реализации, лишь усложняет задачу.
Абстрактные базовые классы - это на самом деле не что иное, как способ поделиться реализацией, которая является общей для нескольких подклассов. Но остерегайтесь избегать интерфейса и напрямую связываться с абстрактным базовым классом - то, что вы делаете, это устанавливает в камне то, что вы не только привязываетесь к интерфейсу абстрактной базы, но и всегда переносите вокруг реализации. Много раз, когда то, что кажется заданным сегодня, поворачивается на 180 градусов через несколько месяцев / лет, и это своего рода «постоянное» решение, которое вы не должны принимать легкомысленно. На мой взгляд, стоимость всегда иметь интерфейс намного меньше.
Таким образом, по сути, есть интерфейс для документирования Типа , и, если среди разработчиков типа вы видите много потенциальных повторного использования кода, создайте абстрактную базу, которая наследуется от интерфейса. Абстрактная база также может вводить чисто виртуальные методы перехвата, которые действительно являются деталями реализации и обеспечивают удобство и повторное использование кода.
Наконец, вы можете быть разочарованы, если ваши интерфейсы не верны - в этом случае они просто усложняют ситуацию (т. Е. У вас есть вся дополнительная работа с интерфейсами и нет никаких преимуществ, а затем они чувствуют себя совершенно неправильно) - но это дает что вы говорите, это не похоже на случай.
Полное раскрытие - Я не разработчик .NET. Я разработчик Java / Python, хотя я имею приличное знакомство с .NET. На моем рабочем месте гораздо больше разработчиков .NET, чем разработчиков Java, и мы довольно много обсуждаем их. Кроме того, я нахожу это чувство, что интерфейсы слишком часто используются в мире .NET, а не среди разработчиков Java - но это только моя точка зрения.