Rohkem
Mis vahe on liidese ja abstraktse klassi vahel?
Mis vahe on täpselt liidesel ja abstraktsel klassil?
1699
3
Mis vahe on täpselt liidesel ja abstraktsel klassil?
Liidesed
Liides on leping: Inimene, kes kirjutab liidese, ütleb: "hei, ma aktsepteerin, et asjad näevad välja nii", ja inimene, kes kasutab liidese, ütleb: "OK, klass, mille ma kirjutan, näeb välja nii".
Liides on tühi kest. Seal on ainult meetodite signatuurid, mis tähendab, et meetoditel ei ole keha. Liides ei saa midagi teha. See on lihtsalt muster.
Näiteks (pseudokood):
Liidese rakendamine kulutab väga vähe protsessorit, sest see ei ole klass, vaid lihtsalt hunnik nimesid, ja seetõttu ei ole vaja teha mingeid kalleid otsinguid. See on suurepärane, kui see on oluline, näiteks manussüsteemides.
Abstraktsed klassid
Abstraktsed klassid, erinevalt liideseist, on klassid. Nende kasutamine on kallim, sest nende pärimisel tuleb teha otsing.
Abstraktsed klassid näevad välja nagu liidesed, kuid neil on midagi enamat: Nende jaoks saab defineerida käitumist. See on rohkem sellest, et inimene ütleb: "täna klassid peaksid välja nägema nii ja naa, neil on see ühine, seega täida tühjad kohad!".
Näiteks:
Rakendamine
Kuigi abstraktsed klassid ja liidesed peaksid olema erinevad mõisted, teevad rakendused selle väite mõnikord ebatõeseks. Mõnikord ei ole nad isegi mitte see, mida te arvate, et nad on.
Java's on see reegel rangelt rakendatud, PHP's aga on liidesed abstraktsed klassid, mille puhul ei ole meetodit deklareeritud.
Pythonis on abstraktsed klassid pigem programmeerimistrikk, mida saab ABC-moodulist ja tegelikult kasutatakse metaklasse ja seega klassid. Ja liidesed on selles keeles rohkem seotud pardatüüpimisega ja see on segu konventsioonidest ja spetsiaalsetest meetoditest, mis kutsuvad deskriptoreid (__meetodid___ meetodid).
Nagu programmeerimisel ikka, on teooria, praktika ja praktika teises keeles :-)
Selgitus on leitav siit:
Igatahes tundub mulle see liidesete seletus mõnevõrra segadusttekitav. Levinum määratlus on: Liides määratleb lepingu, mida rakendavad klassid peavad täitma. Liidese definitsioon koosneb avalike liikmete allkirjadest, ilma rakenduskoodita.
See ei ole tegelikult vastus algsele küsimusele, kuid kui te olete saanud vastuse nende erinevusele, jõuate te dilemma "millal-kasutada-kumbagi" juurde: https://stackoverflow.com/questions/1231985/when-to-use-interfaces-or-abstract-classes-when-to-use-both
Mul on piiratud teadmised OOP-st, kuid liideste nägemine grammatika adjektiivi ekvivalendina on mulle seni toiminud (parandage mind, kui see meetod on võlts!). Näiteks on liideste nimed nagu atribuudid või võimed, mida saab klassile anda, ja klassil võib neid olla palju: ISerializable, ICountable, IList, ICacheable, IHappy, ...