Препоръчано, 2025

Избор На Редактора

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

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

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

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

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

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

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

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

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

Ние нямаме концепцията за интерфейс в C ++. Но Java и C # определят интерфейса много добре.

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

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

Общата форма на прилагане на интерфейс в Java:

 class class_name изпълнява Interface_name {// class-body} 

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

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

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

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

Общата форма на прилагане на интерфейс в C #:

 class class_name: interface_name {// class-body} 

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

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

Абстрактен клас може да съдържа конкретни методи, които могат да бъдат използвани от извлечения клас. Но не можете да декларирате абстрактни конструктори или абстрактни статични методи в рамките на абстрактен клас. Общата форма на абстрактния клас в 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