Forskel mellem abstrakt klasse og interface i C #

En abstrakt klasse ligner meget en grænseflade, men konceptet er lidt forvirrende for begyndere af OOP. Konceptuelt ser en abstrakt klasse ligesom en grænseflade naturligvis uden nogen implementering, men de har deres retmæssige andel af forskelle. Mens en abstrakt klasse enten kan delvis eller fuldt implementeres, skal en grænseflade implementeres fuldstændigt. Den mest markante forskel mellem de to er, at en abstrakt klasse kan have standardimplementering, mens en grænseflade kun er definitionen af ​​metoder, der kun indeholder medlemserklæringerne. Lad os diskutere de teoretiske aspekter af begge detaljer.

Hvad er en abstrakt klasse?

En abstrakt klasse er en speciel type klasse, der fungerer som en base af andre klasser og ikke kan instantieres. Implementeringslogikken for en abstrakt klasse leveres af dens afledte klasser. For at gøre en klassesabstrakt bruges den "abstrakte" modifikator, hvilket betyder, at en vis manglende implementering skal implementeres i klassen, der er afledt herfra. Det indeholder både abstrakte og ikke-abstrakte medlemmer. En abstrakt klasse er beregnet til at give grundlæggende funktionalitet, der kan deles yderligere og tilsidesættes af flere afledte klasser. Det er nyttigt at undgå enhver form for kodeduplikation. De ligner meget grænseflader, men med ekstra funktionalitet.

Hvad er en grænseflade?

En grænseflade er på den anden side ikke en klasse, der kun indeholder signatur af funktionalitet. Det er et mønster uden implementering. Konceptuelt set er det kun definitionen af ​​metoder, der kun indeholder medlemmers erklæring. Det er en tom shell, der ikke indeholder implementeringen af ​​sine medlemmer. Det er som en abstrakt baseklasse, der kun indeholder abstrakte medlemmer, såsom metoder, begivenheder, indekseringsmænd, egenskaber osv. Det kan ikke instantieres direkte, og dets medlemmer kan implementeres af enhver klasse. Derudover kan flere grænseflader implementeres af en klasse, men en klasse kan dog kun arve en enkelt klasse.

Abstrakt klasse vs. interface: forskel mellem abstrakt klasse og interface i C #

  1. Multiple arv - En klasse kan kun bruge en abstrakt klasse, hvorfor flere arver ikke understøttes. En grænseflade kan på den anden side understøtte flere arv, hvilket betyder, at en klasse kan arve ethvert antal arv.
  2. Definition  af Abstrakt klasse og interface i C #- En abstrakt klasse er en speciel type klasse, der kan indeholde definition uden implementering. Implementeringslogikken leveres af dens afledte klasser. Det kan have abstrakte såvel som ikke-abstrakte metoder. En grænseflade er derimod bare et mønster, der ikke kan gøre noget. Teknisk set er det bare en tom skal.
  3. Implementering - En abstrakt klasse kan indeholde både definition og dens implementering. Det er en ufuldstændig klasse, som ikke kan instantieres. En grænseflade kan kun have signaturen til funktionaliteten uden nogen kode.
  4.  Adgang modificeringsmaskiner - En abstrakt klasse kan have adskillige adgangsmodifikatorer som f.eks. Subs, funktioner, egenskaber osv., Mens en grænseflade ikke har tilladelse til at have adgangsmodifikatorer, og alle metoder skal implicit defineres som offentlige.
  5. homogenitet - En abstrakt klasse bruges til implementeringer af samme type, opførsel og status, mens en grænseflade bruges til implementeringer, der kun deler metodesignaturer.
  6. Erklæring - En abstrakt klasse fungerer som en baseklasse for alle andre klasser, så den kan erklære eller bruge en hvilken som helst variabel, mens et interface ikke har tilladelse til at erklære nogen variabler.
  7. Konstruktørerklæring - Mens en abstrakt klasse kan have konstruktørerklæring, kan en grænseflade ikke have konstruktørerklæring.
  8. Kerne vs. perifert - En abstrakt klasse bruges til at definere en klasses kerneidentitet og kan bruges til objekter af samme datatype. På den anden side bruges en grænseflade til at definere en klasses perifere evne.
  9. Stiv vs. smidig - En abstrakt klasse er mere smidig med hensyn til funktionalitet, i det mindste set fra en udviklers perspektiv, mens en grænseflade er mere stiv.

Abstrakt klasse vs. interface: tabelform

Abstrakt klasse

grænseflade

En abstrakt klasse kan have alle adgangsmodifikatorer til medlemserklæring af funktioner, subs og egenskaber. En grænseflade må ikke have adgangsmodifikatorer til medlemserklæring af funktioner, subs, egenskaber osv. Alle medlemmer antages som implicit offentligt.
En klasse kan højst kun bruge en abstrakt klasse. En klasse kan arve ethvert antal grænseflader.
Flere arv understøttes ikke i abstrakt klasse. En grænseflade understøtter muligvis flere arv.
Teknisk set er det en klasse, der muligvis indeholder eller ikke indeholder både definition og implementering. En grænseflade kan kun have signatur af funktionalitet, så det er dybest set en tom skal.
En abstrakt klasse kan indeholde medlemmer. consts, definerede metoder og metodestubber. En grænseflade kan kun indeholde metoder og konsts.
Den definerer en klasses kerneidentitet og bruges til at beskrive objekter af samme datatype. Det bruges til at beskrive en klasses perifere evner.
Medlemmer af en abstrakt klasse kan ikke være statiske, medmindre de er et komplet medlem. Medlemmer af en grænseflade kan ikke være statiske.
Det er ideelt til implementeringer af samme art og fælles opførsel. Det er bedre at bruge grænseflader, hvis flere implementeringer kun deler metodesignaturer.
Det kan have konstruktørerklæring. Det kan ikke have konstruktørerklæring.
En abstrakt klasse har foruddefinerede felter og konstranter. Felter kan ikke defineres i grænseflader.
Det kan have både abstrakte og ikke-abstrakte metoder. Det kan kun have abstrakte metoder.

Resumé

Hvad er forskellen mellem en abstrakt klasse og en grænseflade? Dette er sandsynligvis et af de mest almindelige spørgsmål, der stilles i enhver teknisk samtale. Du finder sandsynligvis en overflod af information om abstrakte klasser og grænseflader i enhver C # tutorial, men at forstå forskellen mellem de to er ganske den hårde del. Du kan konsolidere alle de oplysninger, du kan finde, og stadig ikke få nok. Nå, begrebsmæssigt er begge de vigtigste udtryk i programmering og er helt ens, men de adskiller sig meget hvad angår funktionalitet. Mens en abstrakt klasse er en speciel type klasse, der fungerer som en base for andre klasser, er en grænseflade på den anden side bare en tom skal med kun medlemserklæringer.