Tutorial Java – Conceptul de mostenire

Mostenirea in Java se refera la posibilitatea de a crea o clasa – copil, care are la baza o alta clasa – parinte, astfel incat clasa copil „stie” sa faca tot ceea ce stie parintele, plus o serie de alte elemente care sunt proprii doar clasei copil. Sa luam cazul in care trebuie sa construim un program in care avem urmatoarele clase:

Java


Problema cu aceste clase Java este faptul ca avem o serie de elemente care se repeta in fiecare clasa. Astfel atributele pret si producator si metoda acordaDiscount se regasec in toate aceste trei clase. Fara a utiliza conceptul de mostenire ar trebui sa avem atat atributele cat si metoda multiplicate in fiecare clasa in parte. Probleme care apare, daca am lucra in acest fel, este faptul ca pierdem foarte mult din agilitatea codului. Astfel in cazul in care cineva vrea sa modifice comportamentul metodei acorda discount, nu va avea altceva de facut decat sa faca modificare in 3 locuri distincte (atat in clasa TelefonMobil, cat si in clasele Camasa si Laptop).

Avand in vedere conceptul de mostenire care a fost explicat mai sus vom crea o clasa generala denumita Produs, care va incapsula elementele comune pentru toate aceste trei clase. Aceasta clasa Produs, va servi ca parinte pentru celelate trei clase. Astfel noua structura a claselor devine:

Java


Folosind aceasta „arhitectura” obtinem cel putin doua avantaje :
– pe de o parte codul codul devine ceva mai flexibil, in ideea ca lucrurile comune pentru toate clasele devin mai usor de modficat
– pe de alta parte dimensiunea totala a codului scade. Numarul de aparitii a liniilor de cod care contin atributele comune , seterii si getterii pentru aceste atribute si declaratia metodei acordaDiscount, scazand de la 3 la 1.

Mai jos aveti codul pentru toate aceste clase:

Java
Java


Cateva aspecte care rezulta din codul de mai sus:
a. pentru a extinde o clasa trebuie folosita urmatoare sintaxa

Java


b. in codul de mai sus, keyword-ul super, apeleaza constructorul clasei parinte
c. in metoda afiseazaDetalii, in clasa Laptop, nu avem acces direct la atributul producator mostenit din clasa Propdus. Dat fiind faptul ca atributul producator este declarat ca fiind private, suntem nevoiti sa il accesam prin intermediul getterilor si setterilor, inclusiv in clasele copil. In cazul in care am folosi modificatorul de acces protected, atunci am putea accesa din clasa Laptop atributul producator, fara a mai trece prin getteri si settari. Astfel in cazul in care codul clasei Produs ar arata in felul urmator:

Java


atunci am putea avea in clasa Laptop un cod de forma urmatoare

Java



Modificatorul de acces protected blocheaza accesul din exteriorul unei clase, catre atributele sau metodele acelei clase, exceptie de la aceasta restrictie facand copii acelei clase si clasele care se afla in acelasi pachet cu clasa respectiva.

Mostenirea multipla in Java

In unele limbaje orientate obiect, cum ar fi C++, exista posibilitatea de a avea mai multi parinti directi pentru aceeasi clasa. De exemplu daca avem clasa A care are metodele x() si y() si clasa B care avea metodele z() si t() ne puteam defini o clasa C care avea ca parinti directi atat clasa A cat si clasa B. Astfel in acest moment clasa C dispunea atat de medodele clasei A (si anume x() si y()) cat si de metodele clase B (adica z() si t()).

Chiar daca la prima vedere acest concept de mostenire multipla parte util, in Java s-a reuntat la el, deoarece uneori putea sa genereze destul de multe complicatii. Revenind la exemplul de mai sus ce s-ar f intamplat daca aveam atat in clasa A cat si in clasa B o metoda care numea x() ? In cazul in care in clasa copil C ar fi apleat aceasta metoda x() , atunci urma sa se apele metoda x() din clasa A sau metoda x() din clasa B? Pentru a elimina acest gen de confuzii in Java nu exista mostenire multipla.In ciuda faptului ca nu permite mostenire mutipla se poate insa ca in Java sa avem ceva de genul:

– clasa A este parinte al clasei B
– clasa B este parinte al clasei C
– clasa C este parinte al clasei D
– clasa D este parinte al clasei E
– clasa E este parinte al clasei F

In acest moment clasa F stie sa faca tot ce stie sa faca E, care stie sa faca tot ce stie sa faca clasa D, care stie sa faca tot ce stie sa faca clasa C samd. In aceste conditii printr-un mecanism de mostenire in trepte putem sa ajungem la a aveam clase cu cod relativ mic, insa care au foarte multe metode mostenite. Un exemplu poate fi considerat clasa JFrame, folosita in construirea interfetelor grafice. Astfel intreg „arborele genealogic” al acestei clase este prezentat in figura de mai jos, si in ciuda faptului ca JFrame „stie” sa execute peste 100 de metode, doar o mica parte din aceste metode sunt proprii, restul find mostenite.

Java


Clasa object din Java

Orice clasa in Java are ca parinte implicit clasa Object. De exemplu in cazul clasei Laptop lista completa a metodelor sale este:

Java


Tags: , , , ,



Alte articole si tutoriale:
« »

Oferta limitata eBook gratuit: DUBLEZA-TI VENITUL PRIN CUNOSTINTELE DE IT

Inscrie-te la newsletter si vei primi un eBook gratuit. Vei fi si informat despre ofertele speciale, tutoriale gratis si discount-urile pentru cursurile LEC Academy.

Download ebook
×

Abonare email

Accesul la tutorialele gratuite se face pe baza inscrierii la newsletter. Inscrie-te la newsletter-ul LEC Academy si ai acces la peste 40 de lectii gratuite. Daca doresti, vei fi informat despre ofertele speciale, promotiile si discount-urile pentru cursurile LEC Academy.

Vezi lectii gratis
×