Пишу сюда первый раз) В ходе изучения ООП у меня появился вопрос "Когда использовать интерфейс, а когда абстрактный класс?" Сейчас изучаю паттерн стратегия и не понимаю обязательно ли я должен реализовывать интерфейс в нем. Во многих источниках приводят диаграмму как на изображении ниже. Надеюсь понятно описал свой вопрос. Заранее спасибо за ответ!
1 Answers
С теоретической точки зрения, без привязки к паттерну:
Интерфейс - более универсальная штука. Если вам нужен контракт "есть такие-то методы, их можно вызывать с такими-то параметрами, чтобы получить такой-то результат" - используйте интерфейс. Один и тот же интерфейс может быть реализован в рамках совершенно разных иерархий классов, не связанных друг с другом ничем более, кроме того, что они в конце-концов реализуют нужный интерфейс в том потомке, к которому вы будете обращаться по этому интерфейсу.
А если вы используете абстрактный класс в качестве такого контракта, то любой совместимый с ним класс должен быть его прямым потомком, и это очень ограничивает возможности.
С точки зрения указанного паттерна:
Совершенно не важно, какую именно абстракцию вы будете использовать: интерфейс или абстрактный класс. Выбор вида сущности для абстракции - детали языка C#, а не проектирования.
- 71,194
-
Зря общим сделали, общими надо делать вики-ответы в FAQ-вопросах, которые предназначены для редактирования сообществом и были приняты автором вопроса. Здесь же больше похоже на простой ответ на частный вопрос. – aepot Nov 25 '22 at 11:56
-
@aepot Ну я фиг знает. Думал, если не только я ответ писал, а мне помогали, то надо делать общим, что-то такое ) – CrazyElf Nov 25 '22 at 11:58

C#было множественное наследование, то вообще говоря абстрактный класс был бы так же удобен и гибок, как и интерфейс? Какой-то всё же нетривиальный вопрос, мне кажется. Сходу тяжело сообразить. Хотя возможно ваш ответ по ссылке что-то поясняет в этом плане, я внимательно пока не читал. – CrazyElf Nov 25 '22 at 11:53