Вопрос по поводу использования интерфейсов и абстрактных классов

Пишу сюда первый раз) В ходе изучения ООП у меня появился вопрос "Когда использовать интерфейс, а когда абстрактный класс?" Сейчас изучаю паттерн стратегия и не понимаю обязательно ли я должен реализовывать интерфейс в нем. Во многих источниках приводят диаграмму как на изображении ниже. Надеюсь понятно описал свой вопрос. Заранее спасибо за ответ!

введите сюда описание изображения


Ответы (1 шт):

Автор решения: CrazyElf

С теоретической точки зрения, без привязки к паттерну:

Интерфейс - более универсальная штука. Если вам нужен контракт "есть такие-то методы, их можно вызывать с такими-то параметрами, чтобы получить такой-то результат" - используйте интерфейс. Один и тот же интерфейс может быть реализован в рамках совершенно разных иерархий классов, не связанных друг с другом ничем более, кроме того, что они в конце-концов реализуют нужный интерфейс в том потомке, к которому вы будете обращаться по этому интерфейсу.

А если вы используете абстрактный класс в качестве такого контракта, то любой совместимый с ним класс должен быть его прямым потомком, и это очень ограничивает возможности.

С точки зрения указанного паттерна:

Совершенно не важно, какую именно абстракцию вы будете использовать: интерфейс или абстрактный класс. Выбор вида сущности для абстракции - детали языка C#, а не проектирования.

Ещё немного теории.

→ Ссылка