Рекомендуем, 2024

Выбор редакции

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

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

Сравнительная таблица

Основа для сравненияИнтерфейсАбстрактный класс
основнойКогда вам известно только о требованиях, а не о его реализации, вы используете «Интерфейс».Когда вы частично знаете о реализациях, вы используете «Абстрактные классы».
методыИнтерфейс содержит только абстрактные методы.Абстрактный класс содержит абстрактные методы, а также конкретные методы.
Модификатор доступа к методамМетоды интерфейса всегда "Public" и "Abstract", даже если мы не объявляем. Следовательно, это можно сказать как 100%, чистый абстрактный класс.Не обязательно, чтобы метод в абстрактном классе был публичным и абстрактным. У него могут быть и конкретные методы.
Ограниченный модификатор для методовМетод интерфейса не может быть объявлен со следующими модификаторами:
Государственный: частный и охраняемый
Аннотация: финальная, статическая, синхронизированная, нативная, строгая.
Нет никаких ограничений на модификаторы абстрактной переменной класса.
Модификатор доступа к переменнымМодификатор Acess, разрешенный для переменных интерфейса, является общедоступным, статическим и окончательным независимо от того, декларируем мы или нет.Переменные в абстрактном классе не обязательно должны быть public, static, final.
Ограниченные модификаторы для переменныхПеременные интерфейса не могут быть объявлены как частные, защищенные, временные, изменчивые.Нет ограничений на модификаторы переменных абстрактного класса.
Инициализация переменныхПеременные интерфейса должны быть инициализированы во время их объявления.Не обязательно, чтобы переменные абстрактного класса были инициализированы во время его объявления.
Экземпляр и статические блокиВнутри интерфейса вы не можете объявить экземпляр или статический блок.Абстрактный класс допускает экземпляр или статический блок внутри него.
КонструкторыВы не можете объявить конструктор внутри интерфейса.Вы можете объявить конструктор внутри абстрактного класса.

Определение интерфейса

Java не допускает множественное наследование. То есть один класс не может наследовать более одного класса одновременно. Причину этого можно объяснить на примере. Предположим, у нас есть два родительских класса, A и B, и производный класс C. Производный класс C наследует классы A и B. Теперь у обоих классов A и B есть метод set (), тогда это будет вопрос. для класса C - то, какой метод set () класса должен наследовать. Решением этой проблемы является «интерфейс».

Интерфейс - это чистый абстрактный класс. Ключевое слово, используемое для создания интерфейса - «интерфейс». Поскольку все методы внутри интерфейса полностью абстрактны. Интерфейс только определяет, что должен делать класс, но не определяет, как он это делает. Только потому, что все методы, объявленные внутри интерфейса, являются абстрактными, для интерфейса не создается экземпляр. Общая форма «интерфейса» в Java:

 access_specifier interface interface_name {возвращаемый тип method-name1 (список параметров); возвращаемый метод method-name2 (список параметров); тип final-varname1 = значение; тип final-varname2 = значение; // ... возвращаемый тип method-nameN (параметр-список); тип final-varnameN = значение; } 

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

У нас нет понятия «интерфейс» в C ++. Но Java и C # определяют интерфейс очень хорошо.

Интерфейс в Java:

  • Переменные интерфейса по умолчанию всегда являются общедоступными, статическими и конечными.
  • Переменные должны быть инициализированы во время их объявления.
  • Переменные никогда не могут быть объявлены как частные, защищенные, временные и изменчивые.
  • Методы интерфейса всегда являются открытыми и абстрактными, тогда как они никогда не могут быть объявлены как закрытые, защищенные, конечные, статические, синхронизированные, собственные и строгие.
  • Вы не можете объявить какой-либо конструктор внутри интерфейса, так как основная цель конструктора - инициализация переменных класса, но в интерфейсе переменные инициализируются во время его объявления.
  • Интерфейс может наследовать другие интерфейсы, но класс, реализующий такой интерфейс, должен реализовывать методы всех унаследованных интерфейсов.
  • Класс может наследовать более одного интерфейса одновременно, и он должен реализовывать все методы всех унаследованных интерфейсов.

Общая форма реализации интерфейса в Java:

 class class_name реализует Interface_name {// class-body} 

Для наследования интерфейса класс использует ключевое слово «Implements», а класс реализует весь метод, объявленный унаследованным интерфейсом.

Интерфейс в C #:

Интерфейс в C # почти аналогичен интерфейсу в Java за исключением:

  • Интерфейс в C # не объявляет переменные.
  • Имя интерфейса начинается с заглавной буквы I и наследуется знаком двоеточия (:).

Общая форма реализации интерфейса в C #:

 имя класса class_name: имя_интерфейса {// class-body} 

Определение абстрактного класса

Класс, который содержит один или несколько абстрактных методов, называется абстрактным классом, а класс объявляется как абстрактный с использованием ключевого слова «абстрактный», которому предшествует ключевое слово «класс» в начале объявления класса. Поскольку абстрактный класс содержит абстрактный метод, он представляет собой неполный тип. Следовательно, вы не можете создавать объекты абстрактного класса. Всякий раз, когда класс наследует абстрактный класс, он должен реализовывать все абстрактные методы абстрактного класса, если это не так, тогда он также должен объявляться как абстрактный. Абстрактный атрибут наследуется до тех пор, пока не будет достигнута полная реализация абстрактных методов.

Абстрактный класс также может содержать конкретные методы, которые могут использоваться производным классом как есть. Но вы не можете объявить абстрактный конструктор или абстрактный статический метод внутри абстрактного класса. Общая форма абстрактного класса в Java выглядит следующим образом:

 абстрактный класс class_name {abstract method_name1 (); абстрактный method_name2 (); : return_type method_name3 (parameter_list) {// конкретный метод} return_type method_name4 (parameter_list) {// конкретный метод}}; 

Концепция абстрактного класса похожа как на Java, так и на C #. Абстрактный класс немного отличается в C ++.

В C ++, если у класса хотя бы одна виртуальная функция, класс становится абстрактным классом. Вместо ключевого слова «абстрактный» ключевое слово «виртуальный» используется для объявления абстрактного метода.

Ключевые различия между интерфейсом и абстрактным классом в Java & C #

  1. Если у вас есть знания о том, «что требуется», но не о том, «как это будет реализовано», тогда следует использовать интерфейс. С другой стороны, если вы знаете, что требуется, и частично знаете, как это будет реализовано, используйте абстрактный класс.
  2. Интерфейс имеет все свои абстрактные методы, но абстрактный класс имеет некоторые абстрактные методы и некоторые конкретные методы.
  3. Методы внутри интерфейса являются открытыми и абстрактными, следовательно, он также называется чистым абстрактным классом. С другой стороны, методы внутри реферата не ограничиваются только публичностью и рефератом.
  4. Интерфейсный метод никогда не может быть закрытым, защищенным, окончательным, статическим, синхронизированным, нативным или строгим. С другой стороны, нет никаких ограничений на методы абстрактного класса.
  5. Переменные в интерфейсе являются общедоступными и конечными независимо от того, объявляем мы их или нет, тогда как нет никаких ограничений на то, чтобы переменные абстрактного класса были только общедоступными и конечными.
  6. Переменные в интерфейсе никогда не могут быть частными защищенными временными или изменчивыми, тогда как в абстрактном классе нет ограничений на переменные.
  7. Переменная интерфейса должна быть инициализирована во время объявления. С другой стороны, переменные в абстрактном классе могут быть инициализированы в любое время.
  8. Внутри интерфейса не может быть объявлен экземпляр или статический блок, но вы можете объявить экземпляр или статический блок внутри абстрактного класса.
  9. Вы не можете определить конструктор внутри интерфейса, тогда как вы можете определить конструктор внутри абстрактного класса.

Заключение:

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

Top