Существуют технические отличия между абстрактными классами и интерфейсами, поскольку абстрактный класс может содержать реализацию методов, полей, конструкторов и т. Д., В то время как интерфейс содержит только прототипы методов и свойств. Класс может реализовывать несколько интерфейсов, но он может наследовать только один класс (абстрактный или другой).
Однако, на мой взгляд, наиболее важным различием между интерфейсами и абстрактными классами является семантическая разница.
Интерфейс определяет, что-то может делать (как он себя ведет), а абстрактный класс определяет, что-то есть.
Возьмем, к примеру, IEnumerable
, смысл в этом состоит в том, что все, что реализует IEnumerable
, перечислимо, это не значит, что это перечисление, но оно может вести себя как одно (может быть перечислено).
Контраст, что с washing machine example, все, что наследует, является типом стиральной машины. Все, что наследует его, было бы типом стиральной машины, верхнего загрузчика или бокового погрузчика и т. Д.
Вместо этого, если бы у вас был интерфейс под названием ICanWash
, который мог бы содержать метод под названием Wash
. Вы могли бы использовать различные вещи ICanWash
, будь то Person
, абстрактный класс стиральной машины и т. Д., Где фактическая реализация не имеет значения, просто вам нужно знать, что поведение состоит в том, что он может стирать вещи.
Таким образом, классы определяют, что-то есть, интерфейсы определяют, что-то может сделать.
Ha! возможно, мы могли бы объединить всех наших одновременных ансеров и поделиться репутацией. ;-) –
Mate & llya вы можете продумать свои мысли? Предположим, что у меня есть интерфейс IMath, который содержит два метода AddNumbers() & ConcatenateStrings(). Эти два абстрактных метода также относятся к абстрактному классу Math. Теперь вы можете предложить мне использовать IMath или Math? – WpfBee