Разница между абстрактным классом и интерфейсом в C #

Абстрактный класс очень похож на интерфейс, но эта концепция немного запутывает начинающих ООП. Концептуально абстрактный класс выглядит как интерфейс, разумеется, без какой-либо реализации, однако они имеют свою значительную долю отличий. Хотя абстрактный класс может быть реализован частично или полностью, интерфейс должен быть реализован полностью. Ну, самое заметное различие между ними состоит в том, что абстрактный класс может иметь реализацию по умолчанию, в то время как интерфейс - это просто определение методов, которое содержит только объявления членов. Давайте обсудим теоретические аспекты обоих в деталях.

Что такое абстрактный класс?

Абстрактный класс - это особый тип класса, который действует как база других классов и не может быть создан. Логика реализации абстрактного класса обеспечивается его производными классами. Чтобы сделать класс абстрактным, используется модификатор «abstract», что означает, что некоторая недостающая реализация должна быть реализована в классе, производном от него. Он содержит как абстрактные, так и не абстрактные элементы. Абстрактный класс предназначен для предоставления основных функциональных возможностей, которые могут в дальнейшем использоваться совместно с несколькими производными классами. Полезно избегать любого вида дублирования кода. Они очень похожи на интерфейсы, но с дополнительной функциональностью.

Что такое интерфейс?

Интерфейс, с другой стороны, не является классом, который содержит только сигнатуру функциональности. Это шаблон без реализации. Концептуально говоря, это просто определение методов, которое содержит только объявление членов. Это пустая оболочка, которая не содержит реализацию своих членов. Это как абстрактный базовый класс, который содержит только абстрактные члены, такие как методы, события, индексаторы, свойства и т. Д. Он не может быть создан непосредственно, и его члены могут быть реализованы любым классом. Кроме того, класс может реализовать несколько интерфейсов, однако класс может наследовать только один класс.

Абстрактный класс и интерфейс: разница между абстрактным классом и интерфейсом в C #

  1. Множественное наследование - Класс может использовать только один абстрактный класс, поэтому множественное наследование не поддерживается. Интерфейс, с другой стороны, может поддерживать множественное наследование, что означает, что класс может наследовать любое количество наследований..
  2. Определение  из Абстрактный класс и интерфейс в C #- Абстрактный класс - это особый тип класса, который может содержать определение без реализации. Логика реализации обеспечивается его производными классами. Он может иметь как абстрактные, так и неабстрактные методы. Интерфейс, с другой стороны, это просто шаблон, который ничего не может сделать. Технически это просто пустая оболочка.
  3. Реализация - Абстрактный класс может содержать как определение, так и его реализацию. Это неполный класс, который не может быть создан. Интерфейс может иметь только подпись функциональности без какого-либо кода.
  4.  Модификаторы доступа - Абстрактный класс может иметь несколько модификаторов доступа, таких как подпрограммы, функции, свойства и т. Д., Хотя интерфейсу не разрешено иметь модификаторы доступа, и все методы должны быть неявно определены как открытые..
  5. гомогенность - Абстрактный класс используется для реализаций того же типа, поведения и состояния, в то время как интерфейс используется для реализаций, которые совместно используют только сигнатуры методов..
  6. декларация - Абстрактный класс действует как базовый класс для всех других классов, поэтому он может объявлять или использовать любую переменную, в то время как интерфейсу не разрешено объявлять какие-либо переменные..
  7. Декларация конструктора - В то время как абстрактный класс может иметь объявление конструктора, интерфейс не может иметь объявление конструктора.
  8. Ядро против Периферийного - Абстрактный класс используется для определения основной идентичности класса и может использоваться для объектов одного типа данных. Интерфейс, с другой стороны, используется для определения периферийных возможностей класса.
  9. Жесткий против Supple - Абстрактный класс является более гибким с точки зрения функциональности, по крайней мере, с точки зрения разработчика, в то время как интерфейс более жесткий.

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

Абстрактный класс

Интерфейс

Абстрактный класс может иметь все модификаторы доступа для объявления членов функций, подпрограмм и свойств. Интерфейсу не разрешено иметь модификаторы доступа для объявления членов функций, подпрограмм, свойств и т. Д. Все члены считаются неявно открытыми..
Класс может использовать не более одного абстрактного класса.. Класс может наследовать любое количество интерфейсов..
Многократное наследование не поддерживается в абстрактном классе. Интерфейс может поддерживать множественное наследование.
Технически, это класс, который может содержать или не содержать как определение, так и его реализацию.. Интерфейс может иметь только сигнатуру функциональности, поэтому это в основном пустая оболочка.
Абстрактный класс может содержать члены. consts, определенные методы и заглушки методов. Интерфейс может содержать только методы и аргументы.
Он определяет ядро ​​класса и используется для описания объектов одного типа данных.. Он используется для описания периферийных способностей класса.
Члены абстрактного класса не могут быть статичными, если они не являются полными членами. Члены интерфейса не могут быть статичными.
Идеально подходит для реализаций одного типа и общего поведения. Интерфейсы лучше использовать, если в нескольких реализациях используются только сигнатуры методов.
Может иметь объявление конструктора. У него не может быть объявления конструктора.
Абстрактный класс имеет предопределенные поля и константы. Поля не могут быть определены в интерфейсах.
Может иметь как абстрактные, так и неабстрактные методы. Может иметь только абстрактные методы.

Резюме

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