2009-11-02 2 views
-3

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

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

Единственное, что я нашел, это Visual Studio, достаточно умный, чтобы автоматически генерировать необходимые элементы этого интерфейса.

Итак, что же изменилось?

благодарит вас ~

+1

Возможные дубликаты включают: http: // stackoverflow.com/questions/639592/why-are-interfaces-preferred-to-abstract-classes (java) http://stackoverflow.com/questions/90851/is-it-just-me-or-are-interfaces-overused –

ответ

1

В .NET классы ограничены одним наследованием, но могут реализовывать любое количество интерфейсов. Если вы наследуете абстрактный класс, это единственный, который вы можете использовать. Это не может быть большой проблемой, но это помешает вам, возможно, унаследовать от MarshalByRefObject в будущем.

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

+0

Одиночное наследование верно для всех языков .NET. – shoosh

+0

Спасибо за разъяснение. Я обновил сообщение. –

1
  • Вы можете обеспечить частичную реализацию с абстрактным классом.
  • Интерфейсы не разбивают линию наследования; абстрактные классы. Возможно, вы захотите указать поведение/возможности без создания отношений is-a.
+0

Плюс, интерфейс в C# похож на чистый виртуальный класс в C++. –

0

Интерфейс не может иметь никакой реализации вообще, но абстрактный класс может реализовывать методы и свойства.

5

Концептуально, я вижу простое отличие.

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

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

Это, в свою очередь, приводит к нескольким практическим различиям из-за языковых ограничений (например, C# не поддерживает множественное наследование, за исключением интерфейсов). Что использовать действительно зависит от того, чего вы пытаетесь достичь.

+0

Вы не наследуете интерфейс, не так ли? Я думал, что вы реализовали интерфейс ... (может быть, ошибается) – Svish

+0

Да, вы правы. Вы наследуете базовый класс и реализуете интерфейс. Действительно, два слова служат для различения природы отношения базового класса/производного класса. Я только описал это так, чтобы у меня не было никого, кто прыгал бы на меня, говоря: «C# поддерживает множественное наследование для интерфейсов». Но я тоже могу ошибаться ... –

0

Добавление к @Jeremy короткого и краткого ответа :) Абстрактный класс будет иметь «абстрактные» и «виртуальные» ключевые слова, которые будут указывать, имеет ли метод или свойство реализацию. Абстрактный метод/свойство должны быть реализованы в конкретном классе, но метод/свойство виртуального может не быть переопределены в конкретном классе, так как он уже имеет реализацию в абстрактном классе ...

I надеюсь, что я сам себя понял :))

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