Sunteți pe pagina 1din 4

2.5.

Moştenire

Unul dintre marile avantaje ale programării orientate obiect este posibilitatea de a reutiliza
codul existent. Posibilitatea proiectării de noi clase folosind clase deja construite se numeşte
moştenire. Dacă o clasă A moşteneşte o clasă B, atunci variabilele şi metodele clasei B vor fi
considerate ca aparţinând şi clasei A. Moştenirea permite crearea unor clase “de bază” cu rolul de
a stoca caracteristici comune unor clase diferite, astfel aceste proprietăţi nu vor trebui precizate în
fiecare clasă în parte.
Exemplu: Clasele “triunghi”, “patrulater” şi “cerc” au structuri diferite, dar toate au o arie,
un număr de laturi, perimetru, etc. Pentru ca în cele trei clase să nu se repete aceleaşi elemente,
variabile şi metode, soluţia optimă este proiectarea unei clase “figură geometrică”, în care să se
regăsească caracteristicile comune, şi aceasta să fie moştenită de toate cele trei clase în cauză.

Fig.2.14.

După cum se vede şi din imaginea de mai sus, moştenirea este posibilă şi pe mai multe
niveluri.

A nu se confunda moştenirea unei clase cu instanţierea ei. Numai o clasă poate moşteni
proprietăţile altei clase. În urma instanţierii unei clase rezultă un obiect.

În urma moştenirii unei clase, clasa derivată (care moşteneşte proprietăţile clasei de bază)
nu copie proprietăţile clasei de bază, ci acestea îi sunt direct accesibile.
Datorită proprietăţii de moştenire o clasă derivată nu numai că are acces la variabilele şi
metodele clasei moştenite, dar le şi poate redefini. Datorită acestui fapt o practică obişnuită în
proiectarea orientată pe obiecte este declararea de metode cu corpul vid în clasele de bază,
urmând ca acestor metode să li se ofere un corp în clasele derivate.
Moştenirea uşurează munca proiectanţilor de sisteme informatice prin modularitatea pe
care o promovează, astfel situaţii complexe din lumea reală putând fi mai uşor modelate.
Limbajele obiect permit organizarea claselor de obiecte în ierarhii specializate de la
general la particular, ceea ce permite o programare prin îmbogăţire progresivă. Conform
principiul substituirii toate operaţiile acceptă un parametru de un tip dat, sau acceptă un
parametru de toate subtipurile. În consecinţă o funcţie definită la nivelul unei clase este moştenită
de către toate subclasele, în afara cazului în care se redefineşte nivelul.
Moştenirea poate fi simplă (o clasă nu poate moşteni decât clasa imediat superioară) sau
multiplă (o clasă poate moşteni mai multe clase imediat superioare). În prezent, tot mai multe
limbaje utilizează moştenirea multiplă. Iniţial limbajele pe obiecte ca Smalltalk au cunoscut
moştenirea simplă, în care ierarhia claselor era compusă dintr-un singur arbore având o rădăcină
unică numită obiect.

Obiect

Cont Localitate

Fig.2.15. Exemple de ierarhie a claselor în Smalltalk

În termeni generali, moştenirea poate fi privită ca o implementare a generalizării. Acest


mecanism permite claselor să partajeze atribute şi operaţii pe baza relaţiei de generalizare. Astfel,
dacă o clasă D este o specializare a unei alte clase B, spunem că D moşteneşte clasa B.
Moştenirea este contribuţia esenţială a limbajelor orientate spre obiecte. Ea poate fi
simplă sau multiplă şi permite existenţa polimorfismelor.
Moştenirea simplă apare atunci când o clasă are o singură clasă de bază, însă este cea mai
comună formă de moştenire.
Organizarea claselor după relaţia de generalizare permite gruparea proprietăţilor comune
în interiorul aceleiaşi clase fără duplicarea în alte clase. Exploatând graful claselor, mecanismul
moştenirii permite ca o subclasă să moştenească proprietăţile tuturor superclaselor.
Atunci când se creează un obiect, el copiază nu numai proprietăţile, metodele şi
evenimentele clasei părinte, dar şi valorile prestabilite. El moşteneşte aceste informaţii. Se pot
crea o infinitate de noi clase din cele existente, fiecare dintre acestea vor moşteni toate elementele
predecesoarei. Mai mult, unele obiecte pot avea mai multe clase părinte moştenind toate
proprietăţile acestora.
Putem defini moştenirea ca fiind mecanismul de transmitere al proprietăţilor unei clase
către subclase.
Dacă clasa C2 moşteneşte clasa C1 (C2 fiind subclasa lui C1), atunci C2 are toate
proprietăţile lui C1. De exemplu, un angajat poate să fie în clasa Funcţii în categoriile
corespunzătoare acesteia (vezi fig.2.16.): secretariat, ingineri şi cercetători.
Clasa Secretariat moşteneşte astfel toate proprietăţile clasei Angajaţi conform numelui
acordat. Din punct de vedere al instanţei, o instanţă C2 este de asemenea o instanţă a lui C1. De
exemplu , obiectul secretariat este de asemenea un obiect al obiectului Angajaţi ca şi Cercetătorii
şi Inginerii.

Angajaţi

Secretariat Cercetători Ingineri


Fig.2.16. Moştenire şi clasificare

O instanţă a lui C2 poate de asemenea să aibă şi proprietăţi proprii care să reflecte


specificul său. Figura 2.17. arată specializarea clasei Angajaţi în Ingineri şi Cercetători.
Angajaţi
Destinaţie
Prime

Ingineri Cercetători
Proiecte Brevete
Fig.2.17. Moştenire şi atribute proprii

Proprietăţile destinaţie şi prime sunt definite în Angajaţi şi moştenite de Ingineri şi


Cercetători. În alţi termeni, metoda care dă destinaţia sau care calculează primele angajaţilor este
aceiaşi ca la ingineri sau cercetători. În acelaşi timp, proprietăţile proiecte şi brevete sunt proprii
clasei Ingineri şi respectiv Cercetători.
Moştenirea permite definirea unei relaţii de ordonare între clase care va fi utilă pentru
verificarea siguranţei metode-lor aplicate. Această relaţie de ordonare indică prin C2C1 faptul
că C2 are proprietăţile lui C1, altfel spus că C2 este subclasa lui C1 sau C2=C1. Astfel, în
exemplul de mai jos avem:

IngineriAngajaţiPersonal
AbsolvenţiStudenţiPersonal
PersonalPersonal

Clasa de apartenenţă a unui obiect este aceea care îi permite crearea. Această clasă poate
fi o subclasă caz în care obiectul moşteneşte proprietăţile superclasei. De exemplu, luând obiectul
Angajaţi repartizaţi pe locuri de muncă (pe localităţi) cu toate informaţiile lor moştenite şi proprii
observăm că 01 a fost creat ca aparţinând clasei Angajaţi, 02 clasei Ingineri şi 03 clasei
Cercetători.
<01, angajaţi, (Popescu,010)>
<02, ingineri, (Ionescu,010,proiectCAO)>
<03, cercetători, (Olaru, 010, (brevet1, brevet2))>

Angajatul 01 cunoaşte sistemul ca membru al clasei Angajaţi, însă poate fi specializat


ulterior pentru a deveni cercetător sau inginer. În măsura în care 01 poate fi deja referenţiat din
alte obiecte, el este după bunul plac ca o operaţie de migrare a obiectului fie schimbând tipul, fie
a suportului. Sunt puţine limbaje însă care oferă această facilitate.

Moştenire multiplă
În cazul moştenirii multiple, o clasă poate avea două sau chiar mai multe clase de bază.
Când o clasă nu poate avea o superclasă directă, graful se reduce la un arbore şi
moştenirea este simplă. Când clase diferite au aceleaşi proprietăţi, acestea pot fi duplicate. De
exemplu, presupunând că un student poate fi angajat ca stagiar în acest caz este considerat ca un
angajat în clasa cercetători. Cu moştenirea simplă, pentru reprezentarea proprietăţii durata
stagiului, el va ajuta în primul rând clasa Cercetători şi Studenţi sau creează două subclase ale
aceleiaşi clase.
Moştenirea multiplă rezolvă această problemă permiţând unei clase să posede mai multe
superclase directe şi moştenind proprietăţile tuturor superclaselor.
Moştenirea multiplă poate fi definită ca mecanismul prin care o subclasă moşteneşte
proprietăţile mai multor superclase.
În figura 2.18. este ilustrată clasa Absolvenţi, care se distribuie în clasele Cercetători şi
Studenţi.
Poate apărea un conflict privind numele proprietăţilor moştenite. În calitate de angajaţi ei
vor fi repartizaţi la un grup de lucru. Vor fi posibile mai multe soluţii.
Cea mai simplă şi cea mai des întâlnită este interdicţia conflictului de nume care poate fi
detectată de către compilator, şi ea implică redenumirea proprietăţilor de către programator.
O altă soluţie este utilizarea de prefixe la numele proprietăţilor din numele superclaselor
de unde provin, de exemplu, Destinaţie studenţi. În fine, o soluţie mai elaborată constă în
stabilirea unei priorităţi între superclase putând reţine o singură proprietate.
Personal

Angajaţi Studenţi
Destinaţie Destinaţie

Cercetători

Absolvenţi

Fig.2.18. Moştenire multiplă

Moştenirea multiplă permite cea mai bună organizare a obiectelor evitând redundanţele definirii
atributelor şi metodelor.

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