Liidese ja abstraktse klassi erinevus Java & C-s #

Autor: Laura McKinney
Loomise Kuupäev: 1 Aprill 2021
Värskenduse Kuupäev: 13 Mai 2024
Anonim
Liidese ja abstraktse klassi erinevus Java & C-s # - Tehnoloogia
Liidese ja abstraktse klassi erinevus Java & C-s # - Tehnoloogia

Sisu


Liidese- ja abstraktsusklass aitavad OOP-s kaasa "mittetäielikule tüübile". Mõnikord vajame superklassi, et määratleda „mida teha“, aga mitte „kuidas teha“, vaid see, kuidas osa teha, viib tuletatud klass vastavalt vajadusele ellu „liides”Leidke sellele lahendus. Mõnikord vajame superklassi klassi, mis määratleb üldistatud struktuuri, mida saab tuletatud klasside abil rakendada, ja mõnda täpsustatud struktuuri, mida saab tuletatud klassides kasutada, “abstraktne klass”Pakub sellele lahenduse. Põhiline erinevus liidese ja abstraktse klassi vahel on see, et liides on täielikult puudulik ja abstraktne klass on osaliselt puudulik.

  1. Võrdlusdiagramm
  2. Definitsioon
  3. Peamised erinevused
  4. Järeldus

Võrdlusdiagramm

Võrdluse alusLiidesAbstraktne klass
PõhilineKui teil on teadmisi ainult nõuete, mitte selle rakendamise kohta, kasutate "Liidest".Kui teate rakenduste kohta osaliselt, kasutate "Abstraktklassid".
MeetodidLiides sisaldab ainult abstraktseid meetodeid.Abstraktne klass sisaldab nii abstraktseid kui ka konkreetseid meetodeid.
Meetodite juurdepääsu muutjaLiidese meetodid on alati "Avalikud" ja "Abstraktsed", isegi kui me ei deklareerita. Seega võib seda öelda 100% puhta abstraktse klassina.See ei ole kohustuslik, et abstraktses klassis kasutatav meetod oleks avalik ja abstraktne. Sellel võib olla ka konkreetseid meetodeid.
Meetodite piiratud modifikaatorLiidese meetodit ei saa deklareerida järgmiste modifikaatoritega:
Avalik: privaatne ja kaitstud
Kokkuvõte: lõplik, staatiline, sünkroniseeritud, emakeel, rangefp.
Abstraktse klassimuutuja modifikaatoritel pole piiranguid.
Muutujate juurdepääsu muutjaLiidese muutujatele lubatud juurdepääsu muutja on avalik, staatiline ja lõplik, olenemata sellest, kas deklareerime või mitte.Abstraktse klassi muutujad ei pea olema avalikud, staatilised, lõplikud.
Muutujate piiratud modifikaatoridLiidese muutujaid ei saa kuulutada privaatseteks, kaitstud, mööduvateks, lenduvateks.Abstraktsete klassimuutujate modifikaatoritel pole piiranguid.
Muutujate lähtestamineLiidese muutujad tuleb lähtestada selle deklareerimise ajal.Ei ole kohustuslik, et abstraktsed klassimuutujad tuleb deklareerimise ajal initsialiseerida.
Astmelised ja staatilised plokidSisemises liideses ei saa te kuulutada eksemplari või staatilist plokki.Abstraktne klass võimaldab eksemplari või staatilist plokki selle sees.
KonstruktoridEhitajat ei saa liideses kuulutada.Võite kuulutada konstruktoriks abstraktse klassi sees.


Liidese määratlus

Java ei luba mitut pärimist. See tähendab, et üks klass ei saa pärida rohkem kui ühte klassi korraga. Selle põhjuse saab selgitada näitega. Oletame, et meil on kaks vanemklassi, A ja B ning tuletatud klass C. Tuletatud klass C pärib nii klassid A kui ka B.Nüüd on mõlemal klassil A ja B meetodikomplekt (), siis on klassi C jaoks küsimus, millist klassi komplekti () meetodit ta peaks pärima. Selle probleemi lahendus on “liides”.

Liides on puhas abstraktne klass. Liidese loomisel kasutatud märksõna on “liides”. Kuna kõik liideses olevad meetodid on täiesti abstraktsed. Liides täpsustab ainult seda, mida klass peab tegema, kuid see ei määratle, kuidas ta seda teeb. Kuna kõik liidese sees deklareeritud meetodid on abstraktsed, ei luua liidese jaoks ühtegi eksemplari. Java-liidese üldvorm on:


juurdepääsu_spetsifikaator liides liides_nimi {tagasitüübi meetod-nimi1 (parameetrite loend); tagastamise tüüp meetod-nimi2 (parameetrite loend); tüüp final-varname1 = väärtus; tüüp final-varname2 = väärtus; // ... tagasitüüpi meetod-nimiN (parameetrite loend); tüüp final-varnameN = väärtus; }

Juurdepääsumääraja avalikustatakse, kuna klassid peavad liidese rakendama.

C ++ -s pole meil mõistet “liides”. Kuid Java ja C # määratlevad liidese väga hästi.

Liides Java keeles:

  • Liidese muutujad on vaikimisi alati avalikud, staatilised ja lõplikud.
  • Muutujad tuleb lähtestada nende deklareerimise ajal.
  • Muutujaid ei saa kunagi kuulutada privaatseteks, kaitstavateks, mööduvateks ja muutlikeks.
  • Liidese meetodid on alati avalikud ja abstraktsed, samas kui neid ei saa kunagi kuulutada privaatseteks, kaitstavateks, lõplikeks, staatilisteks, sünkroniseeritud, natiivseteks ja rangeteks failideks.
  • Ühtegi liideses olevat konstruktorit ei saa deklareerida, kuna konstruktori peamine eesmärk on klassimuutujate lähtestamine, kuid liidestes muutujad algväärtustatakse selle deklareerimise ajal.
  • Liides võib pärida teisi liideseid, kuid sellist liidest rakendav klass peab rakendama kõigi päritud liideste meetodeid.
  • Klass võib pärida rohkem kui ühte liidest korraga ja see peab rakendama kõigi päritud liideste kõiki meetodeid.

Java-liidese rakendamise üldine vorm:

klass klassi_nimi rakendab liidese_nime {// klass-keha}

Liidese pärimiseks kasutab klass märksõna „tööriistad“ ja klass rakendab kõiki päritud liidese deklareeritud meetodeid.

Liides C # -s:

C # liides on peaaegu sarnane Java liidesega, välja arvatud:

  • C # liides ei deklareeri muutujaid.
  • Liidese nimi eesliidetakse suure algustähega I ja seda päritakse kooloniga (:).

Liidese rakenduse üldine vorm C # -s:

klass klassi_nimi: liidese_nimi {// klassi-keha}

Abstraktse klassi määratlus

Klassi, mis sisaldab ühte või mitut abstraktset meetodit, nimetatakse abstraktseks klassiks ja klass kuulutatakse abstraktseks, kasutades märksõna „abstraktne”, millele eelneb klassi deklaratsiooni alguses märksõna „klass”. Kuna abstraktne klass sisaldab abstraktset meetodit, kujutab see endast mittetäielikku tüüpi. Seega ei saa te luua abstraktse klassi objekte. Kui klass pärib abstraktse klassi, peab see rakendama kõiki abstraktse klassi abstraktseid meetodeid, kui seda pole, tuleb see samuti deklareerida abstraktseks. Abstraktne atribuut päritakse seni, kuni abstraktsete meetodite täielik rakendamine on saavutatud.

Abstraktne klass võib sisaldada ka konkreetseid meetodeid, mida tuletatud klass saab sellisel kujul kasutada. Kuid te ei saa abstraktses klassis kuulutada abstraktset konstruktorit ega abstraktset staatilist meetodit. Java abstraktse klassi üldine vorm on järgmine:

abstraktne klass klassi_nimi {abstraktne meetod_nimi1 (); abstraktne meetod_nimi2 (); : return_type meetod_nimi3 (parameetri_loend) {// betoonmeetod} return_type meetod_nimi4 (parameetri_loend) {// konkreetne meetod}};

Abstraktse klassi mõiste on sarnane nii Java kui ka C # puhul. Abstraktne klass on C ++ klassides pisut erinev.

Kui klassil on vähemalt üks virtuaalne funktsioon, saab klassist C ++ klass abstraktseks klassiks. Abstraktse meetodi deklareerimiseks kasutatakse märksõna „abstraktne” asemel märksõna „virtuaalne”.

  1. Kui teil on teadmisi selle kohta, mida nõutakse, kuid mitte sellest, kuidas seda rakendada, siis tuleb kasutada liidest. Teisest küljest, kui teate, mis on vajalik, ja osaliselt teate, kuidas see rakendub, kasutage abstraktset klassi.
  2. Liidese kõik meetodid on abstraktsed, kuid abstraktses klassis on mõned abstraktsed meetodid ja mõned konkreetsed meetodid.
  3. Liidese sees olevad meetodid on avalikud ja abstraktsed, seetõttu nimetatakse seda ka puhtaks abstraktseks klassiks. Teisest küljest ei piirdu abstraktses sisesed meetodid üksnes avalike ja ainult abstraktsete meetoditega.
  4. Liidese meetod ei saa kunagi olla privaatne, kaitstud, lõplik, staatiline, sünkroonitud, natiivne või rangefp. Teisest küljest pole abstraktse klassi meetoditele mingeid piiranguid.
  5. Liidese muutujad on avalikud ja lõplikud, olenemata sellest, kas me need kuulutame või mitte, samas kui abstraktse klassi muutujate puhul, mis on avalikud ja lõplikud, sellist piirangut ei ole.
  6. Liidese muutujad ei saa kunagi olla privaatselt kaitstud mööduvad ega muutlikud, samas kui abstraktses klassis pole muutujatele mingeid piiranguid.
  7. Liidese muutuja tuleb deklareerimise ajal lähtestada. Teisest küljest saab abstraktse klassi muutujaid igal ajal lähtestada.
  8. Liidese sees ei saa esinemisjuhtu või staatilist plokki deklareerida, kuid abstraktses klassis saate esinemisjuhu või staatilise ploki deklareerida.
  9. Liidese sees ei saa konstruktorit määratleda, samas kui abstraktses klassis saab konstruktorit määratleda.

Järeldus:

Kui peate looma põhiklassi, mis sisaldab meetodite üldist vormi, mida saab tuletatud klasside abil vastavalt nende vajadusele rakendada, aitab seda teha liidese ja abstraktse klassi mõiste.