Mai mult
Care este diferența dintre o interfață și o clasă abstractă?
Care este exact diferența dintre o interfață și o clasă abstractă?
1699
3
Interfețe
O interfață este un contract: Persoana care scrie interfața spune, "hei, accept ca lucrurile să arate așa", iar persoana care folosește interfața spune "OK, clasa pe care o scriu arată așa".
O interfață este o cochilie goală. Există doar semnăturile metodelor, ceea ce implică faptul că metodele nu au un corp. Interfața nu poate'face nimic. Este doar un model.
De exemplu (pseudocod):
Implementarea unei interfețe consumă foarte puțin procesor, deoarece nu este o clasă, ci doar o grămadă de nume și, prin urmare, nu este nevoie de căutări costisitoare. Este excelent atunci când contează, cum ar fi în cazul dispozitivelor integrate.
Clase abstracte
Clasele abstracte, spre deosebire de interfețe, sunt clase. Utilizarea lor este mai costisitoare, deoarece trebuie să se facă o căutare atunci când se moștenește din ele.
Clasele abstracte seamănă foarte mult cu interfețele, dar au ceva în plus: Puteți defini un comportament pentru ele. Este vorba mai mult despre o persoană care spune: "aceste clase ar trebui să arate așa, și au asta în comun, așa că completați spațiile goale!".
De exemplu:
Implementare
În timp ce clasele abstracte și interfețele ar trebui să fie concepte diferite, implementările fac ca această afirmație să fie uneori neadevărată. Uneori, ele nici măcar nu sunt ceea ce credeți că sunt.
În Java, această regulă este puternic aplicată, în timp ce în PHP, interfețele sunt clase abstracte fără metode declarate.
În Python, clasele abstracte sunt mai mult un truc de programare pe care îl puteți obține din modulul ABC și este de fapt utilizarea metaclaselor și, prin urmare, a claselor. Iar interfețele sunt mai mult legate de tipărirea ratelor în acest limbaj și este un amestec între convenții și metode speciale care apelează descriptori (metodele __metode___).
Ca de obicei cu programarea, există teorie, practică și practică în alt limbaj :-)
O explicație poate fi găsită aici:
Oricum, consider că această explicație a interfețelor este oarecum confuză. O definiție mai obișnuită este: O interfață definește un contract pe care clasele care o implementează trebuie să îl îndeplinească. Definiția unei interfețe constă în semnăturile membrilor publici, fără niciun cod de implementare.
Nu este chiar răspunsul la întrebarea inițială, dar odată ce aveți răspunsul la diferența dintre ele, veți intra în dilema când să folosiți fiecare: https://stackoverflow.com/questions/1231985/when-to-use-interfaces-or-abstract-classes-when-to-use-both
Am cunoștințe limitate despre OOP, dar considerând interfețele ca fiind echivalentul unui adjectiv în gramatică a funcționat pentru mine până acum (corectați-mă dacă această metodă este falsă!). De exemplu, numele interfețelor sunt ca niște atribute sau capabilități pe care le poți da unei clase, iar o clasă poate avea mai multe: ISerializable, ICountable, IList, ICacheable, IHappy, ...