2013-03-02 3 views
36

Предположим, у нас есть два метода: M1() и M2() в интерфейсе. В абстрактном классе также есть те же два абстрактных метода. Если какой-либо класс реализовал этот интерфейс или унаследовал от абстрактного класса, ему придется реализовать оба метода в нем.В чем разница между абстрактным классом и интерфейсом?

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

+0

Ha! возможно, мы могли бы объединить всех наших одновременных ансеров и поделиться репутацией. ;-) –

+0

Mate & llya вы можете продумать свои мысли? Предположим, что у меня есть интерфейс IMath, который содержит два метода AddNumbers() & ConcatenateStrings(). Эти два абстрактных метода также относятся к абстрактному классу Math. Теперь вы можете предложить мне использовать IMath или Math? – WpfBee

ответ

90

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

Однако, на мой взгляд, наиболее важным различием между интерфейсами и абстрактными классами является семантическая разница.

Интерфейс определяет, что-то может делать (как он себя ведет), а абстрактный класс определяет, что-то есть.

Возьмем, к примеру, IEnumerable, смысл в этом состоит в том, что все, что реализует IEnumerable, перечислимо, это не значит, что это перечисление, но оно может вести себя как одно (может быть перечислено).

Контраст, что с washing machine example, все, что наследует, является типом стиральной машины. Все, что наследует его, было бы типом стиральной машины, верхнего загрузчика или бокового погрузчика и т. Д.

Вместо этого, если бы у вас был интерфейс под названием ICanWash, который мог бы содержать метод под названием Wash. Вы могли бы использовать различные вещи ICanWash, будь то Person, абстрактный класс стиральной машины и т. Д., Где фактическая реализация не имеет значения, просто вам нужно знать, что поведение состоит в том, что он может стирать вещи.

Таким образом, классы определяют, что-то есть, интерфейсы определяют, что-то может сделать.

+1

Это то, что я искал. Очень хорошо, потому что это то, о чем я думаю. – marsze

1

Интерфейс позволяет классу наследовать/реализовывать более одного интерфейса, в то время как в C# вы можете наследовать только один класс.

Несколько наследования, в основном.

+1

Итак, окончательное взятие для меня из этого обсуждения: 1. Интерфейс определяет, что-то может сделать (как он себя ведет), а абстрактный класс определяет, что-то есть. 2. По возможности используйте интерфейсы, а не абстрактные классы. Причина: если у вас есть класс, который уже реализовал некоторые интерфейсы и наследует один класс. Таким образом, в этом случае этот класс не сможет наследовать ваш абстрактный класс, поскольку множественное наследование ограничено. Но если он хочет реализовать интерфейс, тогда проблем нет. – WpfBee

+1

Совсем правильно, но если вы реализуете интерфейс (в объявлении класса), вам нужно его закодировать - выбора не существует. Просто уточню, что на всякий случай. – CharlesW

1

Аннотация Класс не только содержит абстрактные методы, но также может содержать другие поля и методы с имплементацией. В C# вы не можете наследовать из многоуровневых классов, но вы можете реализовать мультиплексированные интерфейсы. Итак, короткий ответ: по возможности используйте интерфейсы, а не абстрактные классы. В вашем примере это возможно и рекомендуется использовать интерфейс.

+0

Да, это имеет смысл. – WpfBee

1

Два быстрых мысли о различиях между интерфейсами и абстрактными классами:

  1. абстрактные классы желательно, если в будущем расширение, скорее всего, как абстрактный класс может быть расширен, но интерфейс должен быть повышена добавлением другого интерфейса, I2.
  2. Одиночный (реализация) метод наследования выбирает абстрактные классы careully, чтобы наиболее точно отразить истинную основную природу. Интерфейсы можно легко добавить к выполнению, но абстрактный класс может быть добавлен , если его еще нет.
3

От MSDN:

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

Таким образом, использование интерфейса, если вы хотите, чтобы любой класс может наследовать, что методы.

Из того же страницы MSDN:

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

+0

Предположим, что в настоящее время нет четкого требования о его наследовании, чем кто-то предпочитает? – WpfBee

+1

Дополнительные примеры: если вы хотите создать методы/пропозиции, которые могут реализовать другие классы, используйте интерфейс. Но помните, когда вы добавляете/удаляете методы в интерфейсе, тогда вы должны делать то же самое во всех классах, которые его реализуют. В абстрактных классах вы можете добавлять/удалять методы, и это влияет на все классы, наследующие абстрактный класс – Fabio

Смежные вопросы