Sunteți pe pagina 1din 2

2.6.

Polimorfismul

Conceptul de polimorfism îşi are originile în proiectarea şi implementarea limbajelor de


programare. Un limbaj se numeşte monomorf dacă funcţiile, procedurile şi operanzii au un tip
unic. Exemple de limbaje monomorfe pot fi FORTRAN, C, COBOL etc.
Limbajele polimorfe suportă construcţii în care funcţiile acceptă operanzi de tipuri
diferite. În general, un tip polimorf este unul ale cărui operaţii sunt aplicabile asupra mai multor
tipuri de date.
Polimorfismul defineşte caracteristica unei operaţii de a se comporta în mod diferit în
funcţie de clasa de obiecte căreia îi aparţine. Polimorfismul permite invocarea pentru obiectele de
diferite tipuri a operaţiilor cu aceleaşi nume, dar semantică şi implementare diferită. La primirea
mesajului, stabilirea metodei care se aplică se face în mod dinamic, în funcţie de clasa obiectului
în cauză. Instanţe ale unor clase diferite pot fi adresate uniform, primind aceleaşi mesaje, dar
manifestă comportamente diferite.
Polimorfismul este asociat cu moştenirea. O subclasă poate executa o metodă moştenită,
răspunsul la mesaj fiind determinat de metoda moştenită de la superclasă.
Este uneori necesar redefinirea unei metode moştenite pentru realizarea unei implementări
diferite (cu coduri diferite) care conţine proprietăţi locale (nemoştenite) ale unei clase. Metoda
redefineşte sub acelaşi nume ca metoda moştenită diferenţiindu-se prin argumentele proprii
(implicite), desemnând obiectul pe care metoda îl aplică. De exemplu, redefinirea metodei m din
C1 presupune:
m(C1,T1,…….Tn):Tr
în metoda m la C2 vom avea:
m(C2,T1,….,Tn):Tr
în care Ti este un tip de atribut. Altfel spus metoda m a lui C2 redefineşte metoda m a lui
C1 cu un cod diferit. O metodă redefinită poate lua diferite forme sau poate fi implementată în
funcţie de tipul obiectului care se aplică. Această metoda este denumită polimorfism.
Abilitatea unei metode cu un anumit nume să aibă comportări diferite, în funcţie de
parametrii de intrare se numeşte polimorfism. Nu trebuie să se confunde această proprietate cu
cea de moştenire, cu ajutorul căreia se pot redefini metodele moştenite de la o altă clasă.
Polimorfismul se referă la metode cu acelaşi nume şi cu parametri de intrare şi/sau ieşire diferiţi.
În ceea ce priveşte moştenirea este vorba de metode redefinite, dar care îşi păstrează aceeaşi
signatură (acelaşi nume şi parametri de intrare/ieşire).
Polimorfismul are un rol foarte important în reutilizarea codului. Să presupunem că avem
o clasă “operaţii aritmetice” cu o metodă care să primească două numere oarecare (reale sau
complexe). Dacă polimorfismul nu ar fi luat în calcul, atunci ar trebui implementate metode,
fiecare cu o denumire diferită, pentru toate cele patru cazuri: (număr real + număr real, număr
real + număr complex, număr complex + număr real, număr complex + număr complex) şi
utilizatorul clasei ar trebui să ţină minte toate cele patru nume de metode pentru a face o adunare.
Cu ajutorul polimorfismului, cele patru metode distincte pot avea acelaşi nume şi programatorul
care utilizează clasa “operaţii aritmetice” nu trebuie să reţină decât o singură denumire,
compilatorul alegând varianta corectă în funcţie de parametrii de intrare furnizaţi.
Pe scurt, prin polimorfism o metodă poate executa acţiuni diferite , în funcţie de
parametrii de intrare care îi sunt furnizaţi. Se realizează o interfaţă de comunicare a obiectului cu
exteriorul mult mai unitară şi flexibilă(metoda “adunare” are un singur nume şi nu patru),
proiectanţii putând să se concentreze mai bine asupra modului cum să folosească obiectele, fiind
scutiţi de detalii de implementare.
În unele limbaje de programare care suportă metoda orientată pe obiecte, cum ar fi C++,
este permisă chiar şi supraîncărcarea operatorilor standard predefiniţi. De exemplu operatorul
“+”, destinat efectuării operaţiei de adunare pentru numere reale poate fi făcut să execute şi alte
tipuri de adunări.  
Polimorfismul este deci facultatea unei metode de a putea fi aplicată la obiecte din clase
diferite. Figura următoare ilustrează polimorfismul asupra aplicaţiei noastre:

Angajaţi
Prime():int

Ingineri Cercetători
Prime():int Prime()int

Fig.2.19. Polimorfismul

Metoda Prime definită în clasa Angajaţi este redefinită în clasele Cercetători şi Ingineri
pentru a prelua atributele proprii (importanţa şi gradul de succes al proiectului, de exemplu) în
codul metodei. Graţie legăturii dinamice selectarea corpului metodei poate fi făcută prin sistemul
de execuţie în funcţie de clasa de apartenenţă a obiectului receptor.
Mecanismul legăturii dinamice este pus în evidenţă prin transferul de mesaje; tratarea
mesajelor constă în selecţionarea codului metodei de executat, ceea ce constituie facilitatea
esenţială. De exemplu, fragmentul din program referitor la Angajaţi, care conţine formula de
calcul a primelor pe fiecare angajat din mulţimea E, poate fi realizată printr-un program
tradiţional care va putea arăta astfel:

For each e in E do case tip (e) of


Angajaţi: prime1 (e)
Ingineri: prime2(e)
Cercetători:prime3(E)

Redefinirea metodei într-o subclasă a Angajaţilor duce la modificarea programului.


Utilizând un limbaj obiect programul de mai sus va deveni un program foarte simplu:

For each e in E do prime(e)

Legătura dinamică permite alegerea unui cod corespondent clasei T a obiectului de


execuţie, în acelaşi timp obiectul este referenţiat printr-o variabilă, fiind o supraclasă a lui T. În
programul de mai sus, dacă variabila e conţine un obiect Cercetători pentru apelarea lui Prime,
este selecţionată metoda Prime din Cercetători. Avantajul este că toate redefinirile ulterioare ale
metodelor nu au impact asupra programului sau a programelor care utilizează această metodă.

S-ar putea să vă placă și