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

Автор: Laura McKinney
Дата На Създаване: 1 Април 2021
Дата На Актуализиране: 13 Може 2024
Anonim
Разлика между интерфейс и абстрактен клас в Java & C # - Технология
Разлика между интерфейс и абстрактен клас в Java & C # - Технология

Съдържание


Интерфейсът и абстрактният клас допринасят за „непълен тип“ в OOP. Понякога се нуждаем от суперклас, за да дефинираме „какво да правя“, но не „как да направя“, той как да направим част ще бъде реализиран от извлечения клас според нуждите му, “интерфейс”Предоставете решение на това. Понякога се нуждаем от клас суперклас, който дефинира някаква обобщена структура, която може да бъде реализирана от производни класове, и някаква определена структура, която може да бъде използвана от извлечените класове,абстрактен клас”Предлага решение на това. Основната разлика между интерфейс и абстрактен клас е, че интерфейсът е напълно непълен, а абстрактният клас е частично непълен.

  1. Сравнителна диаграма
  2. дефиниция
  3. Ключови разлики
  4. заключение

Сравнителна диаграма

Основа за сравнениеинтерфейсАбстрактен клас
ОсновенКогато имате само познания за изискванията, а не за неговото изпълнение, използвате "Интерфейс".Когато частично знаете за реализациите, използвате "Абстрактни класове".
методиИнтерфейсът съдържа само абстрактни методи.Абстрактният клас съдържа абстрактни методи, както и конкретни методи.
Модификатор на достъпа на методиИнтерфейсните методи винаги са „обществени“ и „абстрактни“, дори и да не декларираме. Следователно това може да се каже като 100%, чист абстрактен клас.Не е задължително методът в абстрактен клас да бъде публичен и абстрактен. Може да има и конкретни методи.
Ограничен модификатор за методиИнтерфейсният метод не може да бъде деклариран със следните модификатори:
Публична: Частна и защитена
Резюме: финален, статичен, синхронизиран, нативен, строг.
Няма ограничения за модификаторите на променливата на абстрактния клас.
Модификатор на достъп на променливиДостъпният модификатор за интерфейсните променливи е публичен, статичен и окончателен независимо дали декларираме или не.Променливите в абстрактния клас не трябва да бъдат публични, статични, окончателни.
Ограничени модификатори за променливиИнтерфейсните променливи не могат да бъдат декларирани като частни, защитени, преходни, променливи.Няма ограничение за модификаторите на абстрактни променливи от клас.
Инициализация на променливиИнтерфейсните променливи трябва да се инициализират в момента на декларирането му.Не е задължително променливите от абстрактни класове да се инициализират в момента на декларирането му.
Инстанция и статични блоковеВътре в интерфейса не можете да декларирате екземпляр или статичен блок.Абстрактният клас позволява инстанция или статичен блок вътре в него.
конструкторитеНе можете да декларирате конструктор вътре в интерфейса.Можете да декларирате конструктор в абстрактен клас.


Дефиниция на интерфейс

Java не позволява множествено наследяване. Тоест, един клас не може да наследи повече от един клас наведнъж. Причината за това може да се обясни с пример. Да предположим, че имаме два класа родители, A и B и производен клас C. Производният клас C наследява и класовете A и B.Сега и двата имат клас A и B имат зададен метод (), тогава за клас C ще бъде въпрос кой метод на set () трябва да наследи. Решението на този проблем е „интерфейс“.

Интерфейсът е чист абстрактен клас. Ключовата дума, използвана за създаване на интерфейс, е „интерфейс“. Тъй като всички методи във вътрешния интерфейс са напълно абстрактни. Интерфейсът само определя какво трябва да прави клас, но не определя как го прави. Само защото всички методи, декларирани вътре в интерфейса, са абстрактни, не се създава никакъв случай за интерфейс. Общата форма на "интерфейс" в Java е:


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

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

В C ++ нямаме понятието „интерфейс“. Но Java и C # определят интерфейса много добре.

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

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

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

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

За наследяване на интерфейс, клас използва ключова дума „Implements“ и класът реализира целия метод, деклариран от наследен интерфейс.

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

Интерфейсът в C # е почти подобен на интерфейса в Java с изключение на:

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

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

class class_name: interface_name {// class-body}

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

Клас, който съдържа един или повече абстрактни методи, се нарича абстрактен клас и клас се декларира като абстрактен с помощта на ключовата дума „абстракт“, предхождана от ключовата дума „клас“ в началото на декларацията за клас. Тъй като абстрактният клас съдържа абстрактния метод, той представлява незавършен тип. Следователно не можете да създавате обекти от абстрактен клас. Всеки път, когато клас наследява абстрактен клас, той трябва да прилага всички абстрактни методи на абстрактния клас, ако не го прави, той също трябва да бъде деклариран като абстракт. Абстрактният атрибут се наследява, докато не бъде постигната пълната реализация на абстрактните методи.

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

абстрактен клас class_name {абстрактна метод_име1 (); абстрактен метод_име2 (); : return_type method_name3 (parameter_list) {// конкретен метод} return_type method_name4 (параметър_ списък) {// конкретен метод}};

Концепцията за абстрактен клас е сходна както в Java, така и в C #. Абстрактният клас е малко по-различен в C ++.

В C ++, ако клас поне има една виртуална функция, класът става абстрактен клас. Вместо ключовата дума "абстрактен", ключовата дума "виртуална" се използва за деклариране на абстрактен метод.

  1. Когато имате знания за „какво се изисква“, но не и „как би се реализирало“, тогава трябва да се използва интерфейс. От друга страна, ако знаете какво се изисква и частично знаете как би се реализирало, използвайте абстрактен клас.
  2. Интерфейсът има всички свои методи абстрактни, но абстрактен клас има някои абстрактни методи и някои конкретни методи.
  3. Методите вътре в интерфейса са публични и абстрактни, следователно той се нарича и чист абстрактен клас. От друга страна, методите вътре в абстракт не се ограничават само до публични и абстрактни.
  4. Интерфейсният метод никога не може да бъде частен, защитен, окончателен, статичен, синхронизиран, нативен или строг. От друга страна, няма ограничения за методите на абстрактен клас.
  5. Променливите в даден интерфейс са публични и окончателни независимо дали ги декларираме или не, докато няма такова ограничение за променливите на абстрактния клас да бъдат публични и окончателни само.
  6. Променливите в даден интерфейс никога не могат да бъдат частно защитени преходни или променливи, докато в абстрактен клас няма ограничение за променливи.
  7. Променливата на интерфейса трябва да се инициализира по време на деклариране. От друга страна, променливите в абстрактен клас могат да се инициализират по всяко време.
  8. Вътре в интерфейса не може да бъде деклариран екземпляр или статичен блок, но можете да декларирате екземпляр или статичен блок в абстрактен клас.
  9. Не можете да дефинирате конструктор вътре в интерфейс, докато можете да дефинирате конструктор в абстрактен клас.

Заключение:

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