Skillnad mellan abstrakt klass och gränssnitt i C #

En abstrakt klass ser mycket ut som ett gränssnitt, men konceptet är lite förvirrande för nybörjare av OOP. Konceptuellt ser en abstrakt klass ut som ett gränssnitt, naturligtvis utan genomförande, men de har sin rättvisa andel av skillnaderna. Medan en abstrakt klass kan antingen delvis eller helt implementeras, måste ett gränssnitt implementeras helt. Jo, den mest anmärkningsvärda skillnaden mellan de två är att en abstrakt klass kan ha standardimplementering, medan ett gränssnitt bara är definitionen av metoder som endast innehåller medlemsdeklarationerna. Låt oss diskutera de teoretiska aspekterna av båda detaljerna.

Vad är en abstrakt klass?

En abstrakt klass är en speciell typ av klass som fungerar som en bas i andra klasser och kan inte instansieras. Implementeringslogiken för en abstrakt klass tillhandahålls av dess härledda klasser. För att göra en klass abstrakt används "abstrakt" modifierare vilket innebär att några saknade implementeringsbehov ska genomföras i klassen härledd från den. Den innehåller både abstrakta och icke-abstrakta medlemmar. En abstrakt klass är avsedd att ge grundläggande funktionalitet som kan delas vidare och överskridas av flera härledda klasser. Det är användbart att undvika någon form av koddubbling. De ser väldigt ut som gränssnitt men med extra funktionalitet.

Vad är ett gränssnitt?

Ett gränssnitt är å andra sidan inte en klass som endast innehåller signaturen av funktionalitet. Det är ett mönster utan genomförande. Konceptuellt sett är det bara definitionen av metoder som endast innehåller medlemmarnas förklaring. Det är ett tomt skal som inte innehåller genomförandet av dess medlemmar. Det är som en abstrakt basklass som bara innehåller abstrakta medlemmar som metoder, händelser, indexers, egenskaper etc. Det kan inte direktiseras direkt och medlemmarna kan implementeras av någon klass. Dessutom kan flera gränssnitt implementeras av en klass, men en klass kan bara ärva en enda klass.

Abstrakt klass vs gränssnitt: skillnad mellan abstrakt klass och gränssnitt i C #

  1. Multipla arv - En klass kan bara använda en abstrakt klass, varför flera arv stöds inte. Ett gränssnitt, å andra sidan, kan stödja flera arv, vilket innebär att en klass kan arva ett antal arv.
  2. Definition  av Abstrakt klass och gränssnitt i C #- En abstrakt klass är en speciell typ av klass som kan innehålla definition utan genomförande. Implementeringslogiken tillhandahålls av dess härledda klasser. Det kan ha abstrakta såväl som icke-abstrakta metoder. Ett gränssnitt är å andra sidan bara ett mönster som inte kan göra någonting. Tekniskt är det bara ett tomt skal.
  3. Genomförande - En abstrakt klass kan innehålla både definition och dess genomförande. Det är en ofullständig klass som inte kan ordnas. Ett gränssnitt kan bara innehålla funktionalitetens signatur utan någon kod.
  4.  Access Modifiers - En abstrakt klass kan ha flera åtkomstmodifierare som subs, funktioner, egenskaper etc., medan ett gränssnitt inte får ha åtkomstmodifierare och alla metoder måste implicit definieras som offentliga.
  5. Homogenitet - En abstrakt klass används för implementeringar av samma typ, beteende och status, medan ett gränssnitt används för implementeringar som endast delar metoden signaturer.
  6. Deklaration - En abstrakt klass fungerar som en basklass för alla andra klasser så att den kan deklarera eller använda någon variabel medan ett gränssnitt inte får deklarera några variabler.
  7. Konstruktördeklaration - Medan en abstrakt klass kan ha konstruktördeklaration kan ett gränssnitt inte ha en konstruktördeklaration.
  8. Core vs Peripheral - En abstrakt klass används för att definiera kärnidentiteten hos en klass och kan användas för objekt av samma datatyp. Ett gränssnitt används däremot för att definiera en klasss perifera förmåga.
  9. Rigid vs Supple - En abstrakt klass är mer smidig när det gäller funktionalitet, åtminstone ur en utvecklarperspektiv, medan ett gränssnitt är mer styvt.

Abstrakt klass vs gränssnitt: tabellform

Abstrakt klass

Gränssnitt

En abstrakt klass kan ha alla åtkomstmodifierare för medlemsdeklaration av funktioner, subs och egenskaper. Ett gränssnitt får inte ha åtkomstmodifierare för medlemsdeklaration av funktioner, subs, egenskaper etc. Alla medlemmar antas vara implicit offentligt.
En klass kan mest använda endast en abstrakt klass. En klass får ärva ett antal gränssnitt.
Flera arv stöds inte i abstrakt klass. Ett gränssnitt kan stödja flera arv.
Tekniskt sett är det en klass som kanske innehåller både definition och implementering. Ett gränssnitt kan bara ha signaturen för funktionalitet så det är i grunden ett tomt skal.
En abstrakt klass kan innehålla medlemmar. consts, definierade metoder och metodstubbar. Ett gränssnitt kan bara innehålla metoder och consts.
Det definierar en klasss kärnidentitet och används för att beskriva objekt av samma datatyp. Det används för att beskriva en klasss perifera förmågor.
Medlemmar i en abstrakt klass kan inte vara statiska om det inte är en komplett medlem. Medlemmar av ett gränssnitt kan inte vara statiska.
Den är idealisk för implementeringar av samma slag och vanligt beteende. Det är bättre att använda gränssnitt om flera implementeringar bara delar metodens signaturer.
Det kan ha konstruktördeklaration. Det kan inte ha en konstruktördeklaration.
En abstrakt klass har fördefinierade fält och constrants. Fält kan inte definieras i gränssnitt.
Det kan ha både abstrakta och icke-abstrakta metoder. Det kan bara ha abstrakta metoder.

Sammanfattning

Vad är skillnaden mellan en abstrakt klass och ett gränssnitt? Detta är förmodligen en av de vanligaste frågorna i någon teknisk intervju. Du kommer sannolikt att hitta en mängd information om abstrakta klasser och gränssnitt i någon C # handledning, men förstå skillnaden mellan de två är ganska svårt. Du kan konsolidera all information du hittar och kan fortfarande inte få nog. Tja, begreppsmässigt är båda de viktigaste termerna i programmering och är ganska lika, men de skiljer sig mycket i funktionalitet. Medan en abstrakt klass är en speciell typ av klass som fungerar som en bas för andra klasser är ett gränssnitt å andra sidan bara ett tomt skal med endast medlemsdeklarationer.