knackCoder Ответов: 2

Когда я должен выбрать абстрактный класс вместо интерфейса?


Я провел много поисков относительно этого ответа и пришел к выводу, упомянутому ниже.

Я хочу знать, является ли это достаточно справедливой и обоснованной причиной для выбора одного из них?

Что я уже пробовал:

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

2 Ответов

Рейтинг:
5

Ehsan Sajjad

Самый простой ответ заключается в том, что когда у нас есть некоторые поведения по умолчанию, которые будут одинаковыми для каждого производного класса, который будет наследоваться от базового типа, то абстрактный класс подходит, поскольку мы можем определить метод с реализацией, который также будет повторно использоваться дочерними классами. В то время как для интерфейса мы определяем только сигнатуры, что означает, что он говорит только о том, какое поведение он ожидает получить, когда какой-то тип реализует его.

Обратите внимание, что в более новой версии C# мы также могли бы определить методы с реализацией по умолчанию в интерфейсах.

Вы также можете обратиться к следующим потокам для большей ясности:

Абстрактный класс против интерфейса

Интерфейсы и абстрактные классы


knackCoder

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

Ehsan Sajjad

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

BillWoodruff

+5 Хороший ответ, и я готов поспорить, что "банда четырех" будет иметь кошмары по поводу идеи любой "реализации" в интерфейсах: эта идея является предлагаемой функцией C# 8, и мы не знаем, будет ли она реализована.

Смотрите: https://dotnetcoretutorials.com/2018/03/25/proposed-default-interface-methods-in-c-8/

Ehsan Sajjad

Спасибо @Bill и да, он еще не вышел как часть C# 8

Рейтинг:
13

Maciej Los

Пожалуйста, проверь это: ООП - интерфейс vs абстрактный класс (general OO)[^]


CPallini

5.

Maciej Los

Спасибо, Карло.