Soovitatav, 2024

Toimetaja Valik

Erinevus liidese ja abstraktse klassi vahel Java & C #

Liides ja abstraktsus klassi mõlemad annavad OOP-s “mittetäieliku tüübi”. Mõnikord on vaja, et "mida teha", aga mitte "kuidas seda teha", on see, kuidas seda osa rakendada, tuletatud klassi järgi vastavalt vajadusele, " liides " annab sellele lahenduse. Mõnikord vajame superklassi klassi, mis määratleb üldistatud struktuuri, mida saab rakendada tuletatud klasside ja mõne kindla struktuuri abil, mida tuletatud klassid saavad kasutada, “ abstraktne klass ” pakub sellele lahenduse. Põhiline erinevus liidese ja abstraktse klassi vahel on see, et liides on täielikult mittetäielik ja abstraktne klass on osaliselt puudulik.

Võrdluskaart

Võrdluse alusLiidesAbstraktne klass
PõhilineKui teil on teadmised nõuetest mitte ainult selle rakendamise kohta, kasutate "Interface".Kui teate osaliselt rakendustest, mida te kasutate "Abstraktsed klassid".
MeetodidLiides sisaldab ainult abstraktseid meetodeid.Abstraktne klass sisaldab nii abstraktseid meetodeid kui ka konkreetseid meetodeid.
Juurdepääs meetodite modifitseerijaleLiidesmeetodid on alati "avalik" ja "abstraktne", isegi kui me ei deklareeri. Seega võib öelda, et see on 100% puhas abstraktne klass.See ei ole kohustuslik, et abstraktse klassi meetod on avalik ja abstraktne. Sellel võib olla ka konkreetseid meetodeid.
Piiratud modifitseerija meetodite jaoksLiidese meetodit ei saa deklareerida järgmiste modifikaatoritega:
Avalik: era- ja kaitstud
Kokkuvõte: lõplik, staatiline, sünkroniseeritud, natiivne, rangefp.
Abstraktse klassi muutuja modifikaatoritel ei ole piiranguid.
Muutujate ligipääsu muutmineLiidese muutujate jaoks lubatud Acess Modifier on avalik, staatiline ja lõplik, olenemata sellest, kas me deklareerime või mitte.Abstraktse klassi muutujad ei pea olema avalikud, staatilised, lõplikud.
Piiratud muutujad muutujate jaoksLiidese muutujaid ei saa deklareerida privaatsetena, kaitstud, mööduvatena, lenduvatena.Abstraktsete klassi muutujate modifikaatoritel puudub piirang.
Muutujate initsialiseerimineLiidese muutujad tuleb algatada deklaratsiooni esitamise ajal.Ei ole kohustuslik, et abstraktsed klassi muutujad peavad olema deklaratsiooni esitamise ajal vormindatud.
Näiteks ja staatilised plokidSisene liides, sa ei saa deklareerida eksemplari või staatilist plokki.Abstraktne klass võimaldab selle sees asuvat eksemplari või staatilist plokki.
KonstruktoridTe ei saa konstruktori sisemist liidest välja kuulutada.Saate konstruktori deklareerida abstraktse klassi sees.

Liidese määratlus

Java ei võimalda mitmekordset pärimist. See tähendab, et üks klass ei saa pärida rohkem kui ühte klassi korraga. Selle põhjuseks võib olla näide. Oletame, et meil on kaks vanemat klassi, A ja B ning tuletatud klass C. Saadud klass C pärsib nii klassid A kui ka B. Nüüd on mõlemal klass A ja B meetodite komplekt (), siis on küsimus C-klassi puhul, millise klassi () meetod peaks pärima. Selle probleemi lahenduseks on „liides”.

Liides on puhas abstraktne klass. Liidese loomiseks kasutatav märksõna on „liides”. Kuna kogu liidese sees olev meetod on täielikult abstraktne. Liideses täpsustatakse ainult seda, mida klass peab tegema, kuid ei määratle, kuidas see seda teeb. Lihtsalt seetõttu, et kogu liidese sees deklareeritud meetod on abstraktne, ei ole liidese jaoks loodud ühtegi eksemplari. Java “liidese” üldine vorm on:

 access_specifier liidese liidese_nimi {tagasipöördumistüübi-nimi1 (parameetrite nimekiri); tagasipöördumismeetodi nimi2 (parameetrite nimekiri); tüüp lõplik-varname1 = väärtus; tüüp lõplik-varname2 = väärtus; // ... tagasi-tüüpi meetod-nimiN (parameetrite nimekiri); tüüp lõplik-varnameN = väärtus; } 

Juurdepääsu spetsifikatsioon avalikustatakse, kuna klassid peavad liidese rakendama.

Meil ei ole C + + -es mõiste „liides”. Kuid Java ja C # defineerivad liidese väga hästi.

Java-liides:

  • Liidese muutujad on vaikimisi alati avalikud, staatilised ja lõplikud.
  • Muutujad tuleb vormindada deklaratsiooni esitamise ajal.
  • Muutujad ei saa kunagi kuulutada privaatseteks, kaitstud, mööduvateks ja lenduvateks.
  • Liidese meetodid on alati avalikud ja abstraktsed, kuid neid ei saa kunagi kuulutada privaatseteks, kaitstud, lõplikeks, staatilisteks, sünkroniseeritud, natiivseteks ja rangeteks.
  • Te ei saa mingit konstruktori sisemist liidest deklareerida, kuna konstruktori peamine eesmärk on klassi muutujate initsialiseerimine, kuid liidesemuutujate puhul algatatakse need deklaratsiooni esitamise ajal.
  • Liides võib pärida teisi liideseid, kuid sellist liidest rakendav klass peab rakendama kõigi päritud liideste meetodid.
  • Klass võib pärida rohkem kui ühe liidese korraga ja see peab rakendama kõik päritud liideste kõik meetodid.

Java-liidese rakendamise üldine vorm:

 klassi klassi_nimi rakendab Interface_name {// class-body} 

Liidese pärandamiseks kasutab klass märksõna "rakendab" ja klass rakendab kõiki päritud liidese poolt deklareeritud meetodeid.

C # liides:

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

  • C # liides ei näita muutujaid.
  • Liidese nimi on eesotsas pealinnaga I ja pärineb käärsoole (:) märgiga.

Liidese rakendamise üldine vorm C #:

 klassi klassi_nimi: liidese_nimi {// klass-keha} 

Abstraktse klassi määratlus

Ühte või enamat abstraktset meetodit sisaldavat klassi nimetatakse abstraktseks klassiks ja klass tunnistatakse abstraktseks, kasutades märksõna „abstraktne”, millele eelneb klassi deklaratsioon klassi märksõna ees. Kuna abstraktne klass sisaldab abstraktset meetodit, moodustab see mittetäieliku tüübi. Seega ei saa te luua abstraktse klassi objekte. Kui klass pärineb abstraktsest klassist, peab ta rakendama abstraktse klassi abstraktsed meetodid, kui ta seda ei tee, siis peab see olema ka abstraktne. Abstraktne atribuut pärineb kuni abstraktsete meetodite täieliku rakendamiseni.

Abstraktne klass võib sisaldada ka konkreetseid meetodeid, mida tuletatud klass võib kasutada. Kuid te ei saa abstraktses klassis deklareerida abstraktset konstruktorit või abstraktset staatilist meetodit. Abstraktse klassi üldine vorm Java on järgmine:

 abstraktse klassi_nimi {abstraktne meetod_nimi1 (); abstraktne meetod_nimi2 (); : return_type method_name3 (parameeter_list) {// konkreetne meetod} return_type method_name4 (parameeter_list) {// konkreetne meetod}}; 

Abstraktse klassi mõiste on sarnane nii Java kui ka C #. Abstraktne klass on C ++-s veidi erinev.

C ++ -is, kui klassil on vähemalt üks virtuaalne funktsioon, muutub klass abstraktseks klassiks. Märksõna “abstraktne” asemel kasutatakse abstraktse meetodi deklareerimiseks märksõna „virtuaalne”.

Peamised erinevused liidese ja abstraktse klassi vahel Java & C #

  1. Kui teil on teadmised „mis on vajalik”, kuid mitte “kuidas seda rakendatakse”, tuleb kasutada liidest. Teisest küljest, kui te teate, mida on vaja ja osaliselt teada, kuidas seda rakendatakse, siis kasutage abstraktset klassi.
  2. Liidesel on kõik oma meetodid abstraktsed, kuid abstraktsel klassil on mõned abstraktsed meetodid ja mõned konkreetsed meetodid.
  3. Liidese sees olevad meetodid on avalikud ja abstraktsed, mistõttu seda nimetatakse ka puhtaks abstraktseks klassiks. Teisest küljest ei ole abstraktse sisemised meetodid piiratud ainult avalikkuse ja abstraktiga.
  4. Liidese meetod ei saa kunagi olla era-, kaitstud, lõplik, staatiline, sünkroniseeritud, natiivne või range. Teisest küljest ei ole abstraktse klassi meetoditele piiranguid.
  5. Liideses olevad muutujad on avalikud ja lõplikud olenemata sellest, kas need deklareerime või mitte, samas kui abstraktse klassi muutujate jaoks sellist piirangut ei ole ainult avalik ja lõplik.
  6. Liideses olevad muutujad ei saa kunagi olla privaatselt kaitstud ajutised või lenduvad, samas kui abstraktses klassis ei ole muutujate suhtes mingeid piiranguid.
  7. Liidese muutuja tuleb deklaratsiooni ajal lähtestada. Teisest küljest saab abstraktse klassi muutujaid initsialiseerida igal ajal.
  8. Liidese sees ei saa deklareerida eksemplari või staatilist plokki, kuid saate deklareerida eksemplari või staatilise ploki abstraktse klassi sees.
  9. Te ei saa konstruktorit määratleda liidese sees, samas kui saate konstruktori määratleda abstraktse klassi sees.

Järeldus:

Kui peate looma baasklassi, mis sisaldab üldistatud meetodite vormi, mida saab tuletatud klasside järgi rakendada vastavalt nende vajadusele, aitab liidese ja abstraktse klassi mõiste seda teha.

Top