O clasă abstractă arată foarte mult ca o interfață, dar conceptul este puțin confuz pentru începătorii OOP. Conceptual, o clasă abstractă arată ca o interfață, bineînțeles, fără nici o implementare, totuși ei au cota lor echitabilă de diferențe. În timp ce o clasă abstractă poate fi implementată parțial sau integral, o interfață trebuie implementată complet. Ei bine, diferența cea mai notabilă dintre cele două este că o clasă abstractă poate avea implementare implicită, în timp ce o interfață este doar definiția metodelor care conține doar declarațiile membrilor. Să discutăm aspectele teoretice ale ambelor în detaliu.
O clasă abstractă este un tip special de clasă care acționează ca bază a altor clase și nu poate fi instanțiată. Logica implementării unei clase abstracte este furnizată de clasele sale derivate. Pentru a face un rezumat de clasă, se utilizează modificatorul "abstract", ceea ce înseamnă că unele implementări lipsă trebuie implementate în clasa derivată din ea. Acesta conține atât membri abstracți, cât și membri ne-abstracți. O clasă abstractă este destinată să ofere funcționalități de bază care pot fi partajate și suprimate de mai multe clase derivate. Este util să evitați orice fel de duplicare a codului. Ele arata foarte mult ca interfete, dar cu funcționalitate adăugată.
O interfață, pe de altă parte, nu este o clasă care conține numai semnătura funcționalității. Este un model fără implementare. Din punct de vedere conceptual, este doar definirea metodelor care conțin doar declarația membrilor. Este o cochilie goală, care nu conține implementarea membrilor săi. Este ca o clasă de bază abstractă care conține numai elemente abstracte cum ar fi metode, evenimente, indexatoare, proprietăți etc. Nu poate fi instanțiată în mod direct și membrii săi pot fi implementați de orice clasă. În plus, mai multe interfețe pot fi implementate de o clasă, totuși, o clasă poate moșteni doar o singură clasă.
Clasa abstractă | Interfață |
O clasă abstractă poate avea toți modificatori de acces pentru declarația membrului de funcții, subs, și proprietăți. | O interfață nu are permisiunea de a avea modificatori de acces pentru declarația membrilor de funcții, subs, proprietăți etc. Toți membrii sunt presupuși implicit publici. |
O clasă poate folosi cel mai mult doar o singură clasă abstractă. | O clasă poate moșteni orice număr de interfețe. |
Moștenirea multiplă nu este acceptată în clasa abstractă. | O interfață poate suporta mai multe moșteniri. |
Din punct de vedere tehnic, este o clasă care poate sau nu să conțină atât definiția, cât și implementarea acesteia. | O interfață poate avea doar semnătura de funcționalitate, deci este în esență o coajă goală. |
O clasă abstractă poate conține membri. constra, metode definite, și metode de stubs. | O interfață poate conține numai metode și conturi. |
Definește identitatea de bază a unei clase și se utilizează pentru a descrie obiecte de același tip de date. | Este folosit pentru a descrie abilitățile periferice ale unei clase. |
Membrii unei clase abstracte nu pot fi statici decât dacă sunt membri compleți. | Membrii unei interfețe nu pot fi statice. |
Este ideal pentru implementări de același tip și comportament comun. | Este mai bine să utilizați interfețe dacă mai multe implementări împart doar semnăturile metodelor. |
Poate avea declarație constructor. | Nu poate avea declarația constructorului. |
O clasă abstractă are câmpuri predefinite și constante. | Câmpurile nu pot fi definite în interfețe. |
Poate avea atât metode abstracte, cât și metode non-abstracte. | Nu poate avea decât metode abstracte. |
Care este diferența dintre o clasă abstractă și o interfață? Aceasta este probabil una dintre cele mai frecvente întrebări adresate în orice interviu tehnic. Este posibil să găsiți o mulțime de informații despre clasele și interfețele abstracte în orice tutorial C #, însă înțelegerea diferenței dintre cele două este o parte destul de dificilă. Puteți consolida toate informațiile pe care le puteți găsi și încă nu pot obține destul. Ei bine, din punct de vedere conceptual, ambii sunt cei mai importanți termeni în programare și sunt destul de aceeași, cu toate acestea, ele diferă foarte mult în termeni de funcționalitate. În timp ce o clasă abstractă este un tip special de clasă care acționează ca bază pentru alte clase, o interfață, pe de altă parte, este doar o coajă goală, cu doar declarații membre.