Абстрактный класс очень похож на интерфейс, но эта концепция немного запутывает начинающих ООП. Концептуально абстрактный класс выглядит как интерфейс, разумеется, без какой-либо реализации, однако они имеют свою значительную долю отличий. Хотя абстрактный класс может быть реализован частично или полностью, интерфейс должен быть реализован полностью. Ну, самое заметное различие между ними состоит в том, что абстрактный класс может иметь реализацию по умолчанию, в то время как интерфейс - это просто определение методов, которое содержит только объявления членов. Давайте обсудим теоретические аспекты обоих в деталях.
Абстрактный класс - это особый тип класса, который действует как база других классов и не может быть создан. Логика реализации абстрактного класса обеспечивается его производными классами. Чтобы сделать класс абстрактным, используется модификатор «abstract», что означает, что некоторая недостающая реализация должна быть реализована в классе, производном от него. Он содержит как абстрактные, так и не абстрактные элементы. Абстрактный класс предназначен для предоставления основных функциональных возможностей, которые могут в дальнейшем использоваться совместно с несколькими производными классами. Полезно избегать любого вида дублирования кода. Они очень похожи на интерфейсы, но с дополнительной функциональностью.
Интерфейс, с другой стороны, не является классом, который содержит только сигнатуру функциональности. Это шаблон без реализации. Концептуально говоря, это просто определение методов, которое содержит только объявление членов. Это пустая оболочка, которая не содержит реализацию своих членов. Это как абстрактный базовый класс, который содержит только абстрактные члены, такие как методы, события, индексаторы, свойства и т. Д. Он не может быть создан непосредственно, и его члены могут быть реализованы любым классом. Кроме того, класс может реализовать несколько интерфейсов, однако класс может наследовать только один класс.
Абстрактный класс | Интерфейс |
Абстрактный класс может иметь все модификаторы доступа для объявления членов функций, подпрограмм и свойств. | Интерфейсу не разрешено иметь модификаторы доступа для объявления членов функций, подпрограмм, свойств и т. Д. Все члены считаются неявно открытыми.. |
Класс может использовать не более одного абстрактного класса.. | Класс может наследовать любое количество интерфейсов.. |
Многократное наследование не поддерживается в абстрактном классе. | Интерфейс может поддерживать множественное наследование. |
Технически, это класс, который может содержать или не содержать как определение, так и его реализацию.. | Интерфейс может иметь только сигнатуру функциональности, поэтому это в основном пустая оболочка. |
Абстрактный класс может содержать члены. consts, определенные методы и заглушки методов. | Интерфейс может содержать только методы и аргументы. |
Он определяет ядро класса и используется для описания объектов одного типа данных.. | Он используется для описания периферийных способностей класса. |
Члены абстрактного класса не могут быть статичными, если они не являются полными членами. | Члены интерфейса не могут быть статичными. |
Идеально подходит для реализаций одного типа и общего поведения. | Интерфейсы лучше использовать, если в нескольких реализациях используются только сигнатуры методов. |
Может иметь объявление конструктора. | У него не может быть объявления конструктора. |
Абстрактный класс имеет предопределенные поля и константы. | Поля не могут быть определены в интерфейсах. |
Может иметь как абстрактные, так и неабстрактные методы. | Может иметь только абстрактные методы. |
В чем разница между абстрактным классом и интерфейсом? Это, наверное, один из самых распространенных вопросов, задаваемых в любом техническом интервью. Скорее всего, вы найдете множество информации об абстрактных классах и интерфейсах в любом учебнике по C #, однако понять разницу между ними довольно сложно. Вы можете объединить всю информацию, которую можете найти, но до сих пор не можете получить достаточно. Ну, концептуально оба являются наиболее важными терминами в программировании и совершенно одинаковы, однако, они сильно различаются по функциональности. В то время как абстрактный класс является особым типом класса, который действует как основа для других классов, интерфейс, с другой стороны, является просто пустой оболочкой с только объявлениями членов.