Mis vahe on liidesel ja vahetult klassist juurdepääsu saamisel?


Vastus 1:

Liidese idee on lasta paljudel erinevatel klassidel väita, et nad on millegagi ühilduvad.

OK, see on selline ebamäärane, vaatame näidet:

Oletagem, et teil on pikk protsess (nt üleöö varundamine või midagi muud) ja soovite sellest protsessi lõppedes inimesi teavitada. Selleks teen liidese nimega “INotifyTaskCompleted”.

avalik liides INotifyTaskCompleted {void teavitaTaskCompleted (); }

OK, nii et meil on liides ühe meetodiga, mille nimi on “értesTaskCompleted”.

Nüüd saan teha näiteks sellise tunni:

avalik klass NotifyViaSMS rakendab rakendust INotifyTaskCompleted {public void teavitaTaskCompleted () {// SMS-i saatmise Blah-kood. }}

OK, nii et mul on klass, mis saab kasutajaid SMS-i teel teavitada, ja olen öelnud, et klass rakendab INotifyTaskCompleted.

Täpsustades, et klass rakendab liidest, peate rakendama kõik liideses olevad meetodid. Klassilepinguga öeldakse: “Ma rakendan seda liidest”. Kui te meetodeid ei rakenda (kui soovite, võivad need olla tühjad), koodi ei kompileerita.

OK, mis saab siis, kui kasutajad ei soovi enam SMS-i saada, tahavad nad hoopis vaiket sõnumit? Nüüd rakendame veel ühte klassi:

avalik klass NotifyViaSlack rakendab rakendust INotifyTaskCompleted {public void teavitaTaskCompleted () {// Blah-kood Slack-sõnumi saatmiseks. }}

Nii et SMS-klassil ja Slack-klassil on väga erinevad rakendused, kuid mõlemad rakendavad sama liidest. Põhimõtteliselt väidavad nad liidese kaudu, et nad on võimelised täitma “INotifyTaskComplete” tööd, kuid see, kui täpselt nad seda tööd täidavad, pole oluline.

Idee on järgmine:

  1. Võite teha liidese, anda selle arendajale ja öelda: „rakendage see minu jaoks palun“. See on suurepärane viis suurte projektide jagamiseks. Te ei lõpe klasside jamaga, kus on üksteise sõltuvus, teil on selgelt täpsustatud liidesed ja nii kaua, kui klassid neid liideseid rakendavad, töötab kõik õigesti. See teeb koodi hõlpsaks ümberreageerimiseks, selle asemel, et vaadata massiivset klassi ja mõelda, et "ma pean selle uuesti kirjutama", vaatate oma liidest rakendamiseks, mis on tavaliselt palju väiksem, ja on täiesti selge, mida peate rakendama, ja mida mitte.

Tagasi SMS / Slacki näite juurde on mõte, et öeldes, et meil on juba pikk varundustoiming, võib sellel ülesandel olla järgmine meetod:

avalik void setTaskNotifier (INotifyTaskCompleted taskComplete);

Selle varuklassi saab läbida SMS-klassist või Slack-klassist ja ta ei tea erinevust. See kutsub meetodit teavitama lihtsaltTaskCompleted () sellest, mis klass talle edastati.

See tähendab, et öeldakse, et mõne aasta pärast ei kasuta enam keegi SMS-i ega vaikseid funktsioone, võite mõne teise sõnumsidesüsteemi jaoks rakendada mõne teise klassi ja seni, kuni olete INotifyTaskCompleted juurutanud, saate selle varuklassile edastada ja see ei aita tea vahet.

Liidesed sobivad suurepäraselt koodi korduvkasutatavaks muutmiseks ja vähem tihedalt üksteisega sidumiseks.


Vastus 2:

Java dokumentatsiooni tsiteerimiseks:

"Liidesed moodustavad lepingu klassi ja välismaailma vahel ning selle lepingu jõustab koostaja ehituse ajal."

Klass, kui see on liidesena deklareeritud, peab sisaldama kõiki määratletud liidese poolt lubatud meetodeid, nt:

Liidese seadistamine:

liides koletis {// võib-olla on meetod, et suunata mängija void targetPlayer (int playerId); // kõigil teie mängu koletistel võib olla tervendamismeetod void healSelf (int newValue); // võib-olla hirmutavad teie koletised ja käivitavad tühja runAway (); }

Nüüd määratlete teie jaoks koletise klassi:

klass spookyGhost rakendab Monsterit {int health = 100; // kuna see juurutab liidese (Monster) // teie kood _kell ei_ kompileeri ilma seal deklareeritud meetoditeta // (saate ikkagi lisada meetodeid, mida teie liides ei luba) void targetPlayer (int playerId) {// koodi asjad } void healSelf (int newValue) {// paranemiskood newValue summa abil} void runAway () {// meetod koletise põgenemiseks}}

Eeliseks on see, et saate seada liidese ja veenduda, et iga klass, mis seda rakendab, on teie valitud meetodite ees. See võib tagada järjepidevuse ja usaldusväärsuse.

Lõppu alustamiseks - Java-dokumentide tsitaadiga:

"Kui teie klass väidab, et rakendab liidest, peavad kõik selle liidese määratletud meetodid ilmuma lähtekoodis enne klassi edukat kompileerimist."