Facultatea de Antreprenoriat, Ingineria si Managementul Afacerilor
Programarea Calculatoarelor II - Laboratorul 5 Responsabil: As.univ. Drd. Ing. Bogdan Tiganoaia, bogdantiganoaia@yahoo.com Obiectivele laboratorului sunt urmatoarele: re!entarea notiunii de polimor"ism #ucrul cu polimor"ism in $ava Prezentarea notiunii de polimorfism Polimorfismul permite folosirea unui obiect in locul altui obiect (a unei subclase in locul unei superclase). Prin aceasta sprijina scrierea de cod eficient cu costuri de dezvoltare si intretinere reduse. Este sustinut doar de limbajele care permit legarea intarziata la apelul metodelor. Acest lucru se refera la modalitatea in care sunt generate in programul executabil apelul rutinelor din program. 1 a limbajele cu !legare timpurie! adresa la care se face un apel spre o rutina se stabileste la compilare si este scrisa in mod univoc in codul obiect rezultat. a limbajele cu legare intarziata" adresa de apel a unei rutine (metode in cazul #ava) se stabileste doar in momentul rularii" functie de contextul in care apare apelul. $n acest fel" spre exemplu" daca se declara o referinta spre o clasa Persoana care indica spre un obiect de tip %tudent" un apel al metodei afiseaza&date() va apela corect metoda cu acest nume din clasa %tudent si pe cea din Persoana. Pentru exemplificare se considera exemplul din figura urmatoare'
(lasa )ird este o clasa abstracta care modeleaza conceptul de pasare. *in ea sunt derivate doua clase concrete si anume +oose (gasca) si Penguin (pinguin). Pentru gestionarea migratiei pasarilor se foloseste o clasa separata numita )ird(ontroler. Aceasta clasa pune la dispozitie o metoda pentru realizarea migrarii denumita reocate(). Problema rezida in a realiza corect deplasarea. $n acest sens +asca poate implementa move() prin apelulul metodei proprii zboara(). Analog" Pinguinul poate implementa move() prin apelulul metodei proprii inoata(). $n momentul cand este apelata metoda reocate() din )ird(ontroler" aceasta va invoca corect metodele move() din subclasele clasei )ird. ,ezultatul este ca pinguinul va inota iar gasca va zbura pentru a realiza migrarea" c-iar daca clasa )ird(ontroler pastreaza referinte doar spre clasa )ird. . *in acest exemplu rezulta de asemenea avantaje la nivelul implementarii si testarii. $nformatii despre o noua pasare pot fi adaugate simplu" fara a modifica clasa )ird(ontroler. $n acest sens este suficient sa se deriveze o noua clasa din )ird" iar aceasta sa implementeze propria metoda move(). Este evident ca adaugarea acestei clase nu introduce erori in clasele existente deja" ca atare codul care implementeaza procesul de migratie nu mai trebuie retestat. Polimorfismul se utilizeaza des pentru a trata unitar colectii de obiecte diferite. *oua metode din aceeasi clasa se numesc supraincarcate (overloaded) daca' 1) Au acelasi nume .) *ifera prin numarul sau tipul argumentelor /) 0u difera doar prin tipul returnat 0umele unei metode impreuna cu numarul si tipul argumentelor se numeste semnatura metodei. Task 1: Parcurgeti urmatorul cod, intelegand notiunea de metode supraincarcate pu!lic class Num!er " pri#ate dou!le n$ pu!lic Num!er%dou!le n& " t'isn ( n$ ) pu!lic dou!le getNum!er%& " return n$ ) pu!lic dou!le add%dou!le m& " return n * m$ ) pu!lic dou!le add%Num!er m& " return n * mgetNum!er%&$ ) ) Task +: ,tudiati si rulati urmatorul cod -a#a, o!ser#and efectul / pu!lic class Num!er " pri#ate dou!le n$ pu!lic Num!er%dou!le n& " t'isn ( n$ ) pu!lic dou!le getNum!er%& " return n$ ) pu!lic dou!le add%dou!le m& " return n * m$ ) pu!lic dou!le add%Num!er m& " return n * mgetNum!er%&$ ) pu!lic static #oid main%,tring args./& " Num!er a,!$ a(ne0 Num!er%+1&$ !(ne0 Num!er%+1&$ ,2stemoutprintln%aadd%311&&$ ,2stemoutprintln%!add%!&&$ 1 ) ) O metoda dintr%o clasa parinte poate "i suprascrisa %o#errided& de o metoda din clasa derivata daca: &' Au acelasi nume (' Au acelasi numar si tip de argumente )' Au acelasi tip returnat *' Drepturile de acces nu sunt mai restranse O metoda nu poate fi suprascrisa decat o data intr4o clasa 2 5egarea dinamica a metodelor: In ca!ul unor metode suprascrise +overrided' nu se va sti decat la e,ecutie care dintre metode va "i apelata. #a apelarea unei metode suprascrise, $ava nu priveste la tipul re"erintei ci la tipul intern al obiectului pentru care este apelata metoda Pla2er p1 ( ne0 Mp3Pla2er%&$ Pla2er p+ ( ne0 6a#Pla2er%&$ 7 p1pla2%&$ 89 ,e #a apela metoda pla2%& a clasei Mp3Pla2er 98 p+pla2%&$ 89 ,e #a apela metoda pla2%& a clasei 6a#Pla2er 98 Task 3: Testati polimorfismul in -a#a, atat supraincarcarea cat si suprascrierea metodelor :;emplu: Realizati ierar'ia de clase descrisa in figura de mai sus %Pla2er, Mp3Pla2er, 6a#Pla2er& )ibliografie' -ttp'33444.opendrum.upt.ro3" 0ote de curs" Programarea in limbajul #ava" +avrila (ristian" .551. 6