Sunteți pe pagina 1din 6

ROMNIA

Universitatea Politehnica din Bucuresti


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