Sammenligningstabel
Grundlag for sammenligning | grænseflade | Abstrakt klasse |
---|---|---|
Grundlæggende | Når du kun har kendskab til kravene ikke om implementeringen, bruger du "Interface". | Når du delvist kender til implementeringer, bruger du "Abstrakte klasser". |
Metoder | Interface indeholder kun abstrakte metoder. | Abstrakt klasse indeholder abstrakte metoder samt konkrete metoder. |
Adgangsmodifikator for metoder | Interface metoder er altid "Offentlige" og "Abstrakte", selvom vi ikke erklærer. Derfor kan det siges som 100%, ren abstrakt klasse. | Det er ikke obligatorisk, at metoden i abstrakt klasse vil være offentlig og abstrakt. Det kan også have konkrete metoder. |
Begrænset modifikator for metoder | En grænseflade metode kan ikke deklareres med følgende modifikatorer: Offentlig: Privat og Beskyttet Abstract: endelig, statisk, synkroniseret, native, strictfp. | Der er ingen begrænsninger på modifikatorerne af abstrakt klassevariabel. |
Adgangsmodifikator for variabler | Acess Modifier tilladt for grænsefladevariabler er offentlige, statiske og endelige, om vi erklærer eller ej. | Variablerne i abstrakt klasse behøver ikke være offentlige, statiske, endelige. |
Begrænsede modifikatorer for variabler | Interfacevariabler kan ikke erklæres som private, beskyttede, forbigående, flygtige. | Der er ingen begrænsninger på modifikatorerne af abstrakte klassevariabler. |
Initialisering af variabler | Interfacevariablerne skal initialiseres på tidspunktet for dens erklæring. | Det er ikke obligatorisk at abstrakte klassevariabler initialiseres på tidspunktet for dens erklæring. |
Instans og statiske blokke | Indvendig interface kan du ikke erklære en instans eller statisk blok. | Abstrakt klasse tillader en forekomst eller statisk blok inde i den. |
Constructors | Du kan ikke deklarere konstruktørens indvendige interface. | Du kan erklære konstruktør inde i en abstrakt klasse. |
Definition af grænseflade
Java tillader ikke flere arv. Det vil sige, at en enkelt klasse ikke kan arve mere end en klasse ad gangen. Årsagen bag dette kan forklares med et eksempel. Lad os antage, at vi har to overordnede klasser, A og B og en afledt klasse C. Den afledte klasse C arver både klasse A og B. Nu har begge klasserne A og B en metodeindstilling (), så bliver det et spørgsmål for klasse C, hvilken klasses sæt () metode skal den arve. Løsningen på dette problem er "interface".
access_specifier interface interface_name {return-type metodenavn1 (parameter-liste); retur-type metodenavn2 (parameter-liste); skriv endelig-varname1 = værdi; skriv endelig-varname2 = værdi; // ... retur-type metodenavnN (parameter-liste); skriv endelig-varnameN = værdi; }
Adgangsspecifikationen erklæres offentlig, fordi klasserne skal implementere grænsefladen.
Vi har ikke begrebet "Interface" i C ++. Men Java og C # definerer grænsefladen meget godt.
Interface i Java:
- Variabler i en grænseflade er som standard altid offentlige, statiske og endelige.
- Variabler skal initialiseres på tidspunktet for dens erklæring.
- Variabler kan aldrig erklæres som private, beskyttede, forbigående og flygtige.
- Metoder til en grænseflade er altid offentlige og abstrakte, mens de aldrig kan erklæres som private, beskyttede, endelige, statiske, synkroniserede, native og strictfp.
- Du kan ikke erklære nogen konstruktør-indvendig grænseflade, da konstruktørens hovedformål er initialisering af klassevariabler, men i grænsefladesvariabler initialiseres på tidspunktet for dens angivelse.
- Interface kan arve andre grænseflader, men klassen implementering af sådan grænseflade skal implementere metoderne for alle de arvede grænseflader.
- En klasse kan arve mere end et interface ad gangen, og det skal gennemføre alle metoderne for alle de arvede grænseflader.
Den generelle form for implementering af en grænseflade i Java:
klasse klassenavn implementerer Interface_name {// class-body}
For at arve en grænseflade bruger en klasse et søgeord "redskaber", og klassen implementerer hele metoden erklæret af en arvet grænseflade.
Interface i C #:
Interface i C # ligner næsten interface i Java undtagen:
- Interface i C # erklærer ikke variabler.
- Navnet på grænsefladen er præfikset med en hovedstad I og erarvet med et kolon (:) tegn.
Den generelle form for implementering af en grænseflade i C #:
klasse klassenavn: interface_name {// class-body}
Definition af abstrakt klasse
En klasse, der indeholder en eller flere abstrakte metoder, kaldes abstrakt klasse, og en klasse erklæres som abstrakt ved hjælp af søgeordet "abstrakt", forud for "klasse" søgeordet i begyndelsen af klassedeklarationen. Da den abstrakte klasse indeholder den abstrakte metode, udgør den en ufuldstændig type. Derfor kan du ikke oprette objekter af en abstrakt klasse. Når en klasse arver en abstrakt klasse, skal den gennemføre alle abstrakte klasses abstrakte metoder, hvis det ikke skal det også forklares som abstrakt. Den abstrakte attributter er arvet, indtil den fuldstændige implementering af abstrakte metoder opnås.
Den abstrakte klasse kan også indeholde konkrete metoder, der kan udnyttes af den afledte klasse som den er. Men du kan ikke erklære en abstrakt konstruktør eller en abstrakt statisk metode inde i en abstrakt klasse. Den generelle form for abstrakt klassen i Java er som følger:
abstrakt klasse klassenavn {abstrakt metodenavn1 (); abstrakt method_name2 (); : return_type method_name3 (parameter_list) {// konkret metode} return_type method_name4 (parameter_list) {// konkret metode}};
Begrebet abstrakt klasse er ens i både Java og C #. En abstrakt klasse er lidt anderledes i C ++.
I C ++, hvis en klasse i det mindste har en virtuel funktion, bliver klassen en abstrakt klasse. I stedet for søgeordet "abstrakt" bruges nøgleordet "virtuelt" til at erklære en abstrakt metode.
Nøgleforskelle mellem grænseflade og abstrakt klasse i Java & C #
- Når du har kendskab til "hvad der kræves" men ikke af "hvordan det ville blive implementeret" så skal interface bruges. På den anden side, hvis du ved hvad der er brug for og delvist ved, hvordan det vil blive implementeret, så brug en abstrakt klasse.
- En grænseflade har alle sine metoder abstrakte, men en abstrakt klasse har nogle abstrakte metoder og nogle konkrete metoder.
- Metoderne inden for en grænseflade er offentlige og abstrakte og kaldes derfor også som en ren abstrakt klasse. På den anden side er metoderne i et abstrakt ikke begrænset til at være offentlige og abstrakte.
- En grænseflade metode kan aldrig være privat, beskyttet, endelig, statisk, synkroniseret, native eller strictfp. På den anden side er der ingen begrænsninger for metoder i en abstrakt klasse.
- Variablerne i en grænseflade er offentlige og endelige, om vi erklærer dem eller ej, mens der ikke er nogen sådan begrænsning for variablerne i en abstrakt klasse, at de kun er offentlige og endelige.
- Variabler i en grænseflade kan aldrig være privat beskyttet forbigående eller flygtig, mens der ikke er nogen begrænsning for variabler i en abstrakt klasse.
- Variablen i en grænseflade skal initialiseres under angivelsen. På den anden side kan variablerne i en abstrakt klasse initialiseres til enhver tid.
- Inden for en grænseflade kan en instans eller statisk blok ikke erklæres, men du kan erklære forekomst eller statisk blok inde i en abstrakt klasse.
- Du kan ikke definere konstruktør inde i en grænseflade, mens du kan definere konstruktor inde i en abstrakt klasse.
Konklusion:
Når du skal oprette en basisklasse, som indeholder en generaliseret form for metoder, der kan implementeres af de afledte klasser efter deres behov, hjælper begrebet grænseflade og abstrakt klasse i at gøre det.