В чем разница между абстрактным классом и интерфейсом в .NET? - PullRequest
0 голосов
/ 02 ноября 2009

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

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

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

Так в чем же разница?

спасибо тебе ~

Ответы [ 5 ]

5 голосов
/ 02 ноября 2009

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

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

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

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

1 голос
/ 02 ноября 2009

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

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

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

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

Надеюсь, я дал понять:))

0 голосов
/ 02 ноября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...