Абстрактный класс и интерфейс в C #

Anonim

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

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

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

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

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

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

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

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

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

Интерфейс

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

Резюме

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