В общем использовании абстракции в случае наследования и полиморфизма. Когда у вас есть объект, который может иметь другое поведение, основанное на его внутреннем типе. Интерфейсы используются, когда есть необходимость в контракте. В целом абстракция лучше всего подходит для объектов, которые тесно связаны, а интерфейсы выбираются для их функциональности.
В вашем случае абстракция имеет смысл. Вы можете сохранить взаимные свойства в своем базовом классе и извлечь из него другие классы. Устраняет некоторый избыточный код.
Вот что предложила MS: Ниже приведены некоторые рекомендации, которые помогут вам решить, использовать ли интерфейс или абстрактный класс для обеспечения полиморфизма для ваших компонентов.
* Если вы ожидаете создания нескольких версий вашего компонента, создайте абстрактный класс. Абстрактные классы предоставляют простой и простой способ для версии ваших компонентов. Обновляя базовый класс, все наследующие классы автоматически обновляются с изменением. С другой стороны, интерфейсы не могут быть изменены после создания. Если требуется новая версия интерфейса, вы должны создать совершенно новый интерфейс.
* Если создаваемая вами функциональность будет полезна для широкого круга разрозненных объектов, используйте интерфейс. Абстрактные классы должны использоваться в основном для объектов, которые тесно связаны, тогда как интерфейсы лучше всего подходят для обеспечения общей функциональности для несвязанных классов.
* Если вы разрабатываете небольшие, краткие биты функциональности, используйте интерфейсы. Если вы разрабатываете большие функциональные единицы, используйте абстрактный класс.
* Если вы хотите предоставить общие, реализованные функции среди всех реализаций вашего компонента, используйте абстрактный класс. Абстрактные классы позволяют частично реализовать ваш класс, тогда как интерфейсы не содержат реализации для каких-либо членов.
https://msdn.microsoft.com/en-us/library/scsyfw1d(v=vs.71).aspx
Все сводится к тому, как вы его видите. Ваш API только заботится о том, что какой-то объект является базовой концепцией «подписки» или он требует более тонкой детализации? В общем, я предпочитаю использовать интерфейсы, это позволяет мне определить базовый контракт, который, как ожидается, будет иметь любая реализация, и позволяет мне обобщать API для принятия рассматриваемого интерфейса, то есть я могу передать, какую реализацию я хочу, не подвергая реализация части API, которая просто не нужна. – MadProgrammer
Абстрактный класс затем используется для обеспечения общих «базовых» реализаций, которые помогают уменьшить дублирование кода и помогают улучшить время, необходимое для создания пользовательских реализаций ... но это только я. Затем это поддерживает концепцию [«программа для интерфейса не для реализации»] (http://www.fatagnus.com/program-to-an-interface-not-an-implementation/) – MadProgrammer