Sammenligningstabell
Grunnlag for sammenligning | Interface | Abstrakt klasse |
---|---|---|
grunn~~POS=TRUNC | Når du kun har kunnskap om kravene ikke om implementeringen, bruker du "Interface". | Når du delvis vet om implementeringene, bruker du "Abstrakte klasser". |
metoder | Grensesnittet inneholder bare abstrakte metoder. | Abstrakt klasse inneholder abstrakte metoder samt konkrete metoder. |
Tilgang Modifier av metoder | Grensesnittmetoder er alltid "Offentlige" og "Abstrakte", selv om vi ikke erklærer. Derfor kan det sies som 100%, ren abstrakt klasse. | Det er ikke obligatorisk at metoden i abstrakt klasse blir offentlig og abstrakt. Det kan også ha konkrete metoder. |
Begrenset modifikator for metoder | En grensesnittmetode kan ikke deklareres med følgende modifikatorer: Offentlig: Privat og Beskyttet Sammendrag: endelig, statisk, synkronisert, innfødt, strictfp. | Det er ingen begrensninger på modifikatorene til abstrakt klassevariabelen. |
Tilgangsmodifikator for variabler | Acess Modifier tillatt for grensesnittvariabler er offentlige, statiske og endelige om vi erklærer eller ikke. | Variablene i abstrakt klasse trenger ikke å være offentlige, statiske, endelige. |
Begrensede modifikatorer for variabler | Grensesnittvariabler kan ikke deklareres som privat, beskyttet, forbigående, flyktig. | Det er ingen begrensning på modifikatorene for abstrakte klassevariabler. |
Initialisering av variabler | Grensesnittvariablene må initialiseres på tidspunktet for erklæringen. | Det er ikke obligatorisk at abstrakte klassevariabler må initialiseres på tidspunktet for erklæringen. |
Instans og statiske blokker | Innvendig grensesnitt, du kan ikke deklarere en forekomst eller statisk blokk. | Abstrakt klasse tillater en forekomst eller statisk blokk inne i den. |
Constructors | Du kan ikke deklarere konstruktørens grensesnitt. | Du kan erklære konstruktør inne i en abstrakt klasse. |
Definisjon av grensesnitt
Java tillater ikke flere arv. Det vil si at en enkelt klasse ikke kan arve mer enn en klasse av gangen. Årsaken bak dette kan forklares med et eksempel. La oss anta at vi har to foreldre klasser, A og B og en avledet klasse C. Den avledede klasse C arver både klasse A og B. Nå har begge klasse A og B metoden sett (), så blir det et spørsmål for klasse C som hvilken klasse setter () metode skal den arve. Løsningen på dette problemet er "grensesnitt".
access_specifier grensesnitt grensesnittnavn {retur-type metodenavn1 (parameter-liste); retur-type metodenavn2 (parameter-liste); skriv endelig-varname1 = verdi; skriv endelig-varname2 = verdi; // ... return-type metodenavnN (parameter-liste); skriv endelig-varnameN = verdi; }
Adgangsspesifikatoren er erklært offentlig fordi klassene må implementere grensesnittet.
Vi har ikke begrepet "Interface" i C ++. Men Java og C # definerer grensesnittet veldig bra.
Grensesnitt i Java:
- Variabler av et grensesnitt er som standard alltid offentlig, statisk og endelig.
- Variabler må initialiseres når de erklæres.
- Variabler kan aldri bli erklært som privat, beskyttet, forbigående og flyktig.
- Metoder for et grensesnitt er alltid offentlige og abstrakte, mens de aldri kan deklareres som private, beskyttede, endelige, statiske, synkroniserte, native og strictfp.
- Du kan ikke deklarere et konstruktørinterface som hovedformålet med konstruktøren er initialiseringen av klassevariabler, men i grensesnittvariabler initialiseres på tidspunktet for erklæringen.
- Grensesnittet kan arve andre grensesnitt, men klassen som implementerer slik grensesnitt, må implementere metodene for alle arvelige grensesnitt.
- En klasse kan arve mer enn ett grensesnitt om gangen, og det må implementere alle metodene for alle arvelige grensesnitt.
Den generelle formen for å implementere et grensesnitt i Java:
klasse klassenavn implementerer Interface_name {// class-body}
For å arve et grensesnitt, bruker en klasse et søkeord "redskaper", og klassen implementerer hele metoden deklarert av et arvet grensesnitt.
Grensesnitt i C #:
Grensesnittet i C # ligner nesten grensesnittet i Java bortsett fra:
- Grensesnitt i C # erklærer ikke variabler.
- Navnet på grensesnittet er prefiks med en hovedstad I og er arvet med et kolon (:) tegn.
Den generelle formen for å implementere et grensesnitt i C #:
klasse klassenavn: interface_name {// class-body}
Definisjon av abstrakt klasse
En klasse som inneholder en eller flere abstrakte metoder kalles abstrakt klasse, og en klasse er erklært som abstrakt ved hjelp av søkeordet "abstrakt", foran "klasse" søkeordet i begynnelsen av klassedeklarasjonen. Som den abstrakte klassen inneholder den abstrakte metoden, er den en ufullstendig type. Derfor kan du ikke lage objekter av en abstrakt klasse. Når en klasse arver en abstrakt klasse, må den implementere alle abstrakte klassens abstrakte metoder dersom det ikke da må det også bli erklært som abstrakt. Den abstrakte egenskapen er arvet til fullstendig implementering av abstrakte metoder oppnås.
Den abstrakte klassen kan også inneholde konkrete metoder som kan benyttes av den avledede klassen som den er. Men du kan ikke erklære en abstrakt konstruktør eller en abstrakt statisk metode inne i en abstrakt klasse. Den generelle formen 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}};
Konseptet med en abstrakt klasse er lik både i Java og C #. En abstrakt klasse er litt annerledes i C ++.
I C ++ hvis en klasse i det minste har en virtuell funksjon, blir klassen en abstrakt klasse. I stedet for søkeordet "abstrakt" brukes søkeordet "virtuelt" til å erklære en abstrakt metode.
Viktige forskjeller mellom grensesnitt og abstrakt klasse i Java og C #
- Når du har kunnskap om "hva som kreves", men ikke av "hvordan det skulle implementeres", må grensesnittet brukes. På den annen side, hvis du vet hva som er nødvendig og delvis vet hvordan det skal implementeres, bruk en abstrakt klasse.
- Et grensesnitt har alle sine metoder abstrakte, men en abstrakt klasse har noen abstrakte metoder og noen konkrete metoder.
- Metodene i et grensesnitt er offentlige og abstrakte, og det kalles også som en ren abstrakt klasse. På den annen side er metodene i et abstrakt ikke begrenset til å være offentlige og abstrakte.
- En grensesnittmetode kan aldri være privat, beskyttet, endelig, statisk, synkronisert, innfødt eller strengfp. På den annen side er det ingen begrensninger på metoder for en abstrakt klasse.
- Variablene i et grensesnitt er offentlige og endelige om vi erklærer dem eller ikke, mens det ikke er noen begrensning for variablene i en abstrakt klasse for å være offentlig og endelig.
- Variabler i et grensesnitt kan aldri være privat beskyttet forbigående eller flyktig, mens det ikke er noen begrensning for variabler i en abstrakt klasse.
- Variabelen i et grensesnitt må initialiseres under deklarasjonen. På den annen side kan variablene i en abstrakt klasse initialiseres når som helst.
- I et grensesnitt kan en forekomst eller statisk blokk ikke deklareres, men du kan erklære forekomst eller statisk blokk inne i en abstrakt klasse.
- Du kan ikke definere konstruktør innenfor et grensesnitt, mens du kan definere konstruktør inne i en abstrakt klasse.
Konklusjon:
Når du trenger å lage en grunnklasse som inneholder en generalisert form for metoder som kan implementeres av de avledede klassene etter behov, hjelper det med grensesnitt og abstrakt klasse å gjøre det.