SlideShare uma empresa Scribd logo
1 de 4
CAPITOLUL 9
obiect

Concepte de bază ale programării orientate

CONCEPTE DE BAZĂ ALE PROGRAMĂRII
ORIENTATE OBIECT
9.1. Introducere
9.2. Abstractizarea datelor
9.3. Moştenirea

9

9.4. Încapsularea informaţiei
9.5. Legarea dinamică (târzie)
9.6. Alte aspecte

9.1. INTRODUCERE
Termenul "OOP" ("Object Oriented Programming") desemnează disciplina programării obiectuale
(orientate-obiect). Această disciplină care are la bază ideea unificării datelor cu modalităţile de prelucrare a
acestora şi manevrează entităţi reprezentate sub formă de obiecte (obiect=date+cod de tratare a acestor date).
Aşa cum s-a subliniat în capitolul 1.3., rezolvarea unei probleme se poate face pe 3 direcţii:
 Rezolvarea orientată pe algoritm (pe acţiune), în care organizarea datelor este neesenţială;
 Rezolvarea orientată pe date, acţiunile fiind determinate doar de organizarea datelor;
 Rezolvarea orientată obiect, care combină tendinţele primelor două abordări.
Programarea obiectuală oferă posibilităţi de modelare a obiectelor, a proprietăţilor şi a relaţiilor dintre ele,
dar şi posibilitatea de a descompune o problemă în componentele sale (soft mai mentenabil, adaptabil,
reciclabil). Câteva exemple de limbaje de programare orientată obiect: SIMULA(1965), SIMULA-2(1967),
Smalltalk, C++, Java (în plus, Java poate fi considerat un limbaj de programare orientată eveniment).
Facilităţile oferite de programarea orientată obiect (conform lui Pascou) sunt:
1. abstractizarea datelor;
2. moştenirea;
3. încapsularea (ascunderea) informaţiei;
4. legarea dinamică (“târzie”).

9.2. ABSTRACTIZAREA DATELOR
Obiectele sunt componente software care modelează fenomene din lumea reală. În general, un fenomen
implică tipuri diferite de obiecte. Obiectele care reprezintă aceeaşi idee sau concept sunt de acelaşi tip şi pot
fi grupate în clase (concrete sau abstracte). Clasele implementează tipuri de date (aşa cum s-a subliniat în
capitolul 2, un tip de date înseamnă o mulţime de valori pentru care s-a adoptatat un anumit mod de
reprezentare şi o muţime de operatori care pot fi aplicaţi acestor valori), deci şi operatorii destinaţi
manipulării acestora: Clasă = Date + Operaţii.
De exemplu, programatorul îşi poate defini tipul (clasa) matrice şi operatorii care pot fi aplicaţi matricilor
(* pentru înmulţirea a două matrici, + pentru adunarea a două matrici, - pentru scăderea a două matrici, etc).
Astfel, el poate folosi tipul matrice în mod similar unui tip predefinit:
matrice A, B;
matrice C=A+B;

Tipul unui obiect (şablon al obiectului) este o clasă. O clasă se caracterizează prin: numele clasei, atribute,
funcţii şi relaţii cu alte clase.
Instanţa este un obiect dintr-o clasă ( A, B, C sunt obiecte, instanţe ale clasei matrice) şi are proprietăţile
definite de clasă. Pentru o clasă definită, se pot crea mai multe instanţe ale acesteia. Toate obiectele au o
stare şi un comportament. Starea unui obiect se referă la elementele de date conţinute în obiect şi la

129
CAPITOLUL 9
obiect

Concepte de bază ale programării orientate

valorile asociate acestora (datele membre). Comportamentul unui obiect este determinat de care acţiunile pe
care obiectul poate să le execute (metodele).
Atributele specificate în definiţia unei clase descriu valoric proprietăţile obiectelor din clasă, sub diferite
aspecte. Cele mai multe limbaje orientate obiect fac următoarea distincţie între atribute:
 atribute ale clasei (au aceeaşi valoare pentru toate instanţele clasei);
 atribute ale instanţei (variază de la o instanţă la alta, fiecare instanţă având propria copie a
atributului).
În limbajul C++ atributele se numesc date membre. Toate datele membre sunt atribute instanţă. Atributele
de clasă se pot obţine în cazul datelor membre statice (aceeaşi adresă de memorare pentru orice instanţă a
clasei).
Metode (funcţii membre). La definirea unei clase se definesc şi metodele acesteia (numite şi funcţii
membre). Fiecare obiect are acces la un set de funcţii care descriu operaţiile care pot fi executate asupra lui.
Metodele pot fi folosite de instanţele clasei respective, dar şi de instanţele altor clase (prin mecanismul
moştenirii).
Clasa conţine atât structurile de date necesare descrierii unui obiect, cât şi metodele care pot fi aplicate
obiectului. Astfel, gradul de abstractizare este, mult mai ridicat, iar programele devin mult mai uşor de
înţeles, depanat sau întreţinut.
La crearea unui obiect, alocarea memoriei se poate fi face static sau dinamic (cu ajutorul unor funcţii
membre speciale, numite constructori). Eliberarea memoriei se realizează cu ajutorul unor funcţii membre
speciale, numite destructori, în momentul încheierii existenţei obiectului respectiv.

9.3. MOŞTENIREA
Moştenirea este o caracteristică a limbajelor de programare orientate obiect, care permite refolosirea codului
şi extinderea funcţionalităţii claselor existente. Între două clase pot exista multe diferenţe, dar şi multe
asemănări. Este bine ca informaţia comună unor clase să fie specificată o singură dată (conceptul de
clasă/subclasă, superclasă/clasă în OOP). Mecanismul moştenirii permite crearea unei ierarhii de clase şi
trecerea de la clasele generale la cele particulare. Procesul implică la început definirea clasei de bază care
stabileşte calităţile comune ale tuturor obiectelor ce vor deriva din bază (ierarhic superioară)(figura 9.1.).
Prin moştenire, un obiect poate prelua proprietăţile obiectelor din clasa de bază.
Clasa A reprezintă clasa de bază (este o generalizare) şi conţine informaţiile
comune (disponibile prin moştenire şi subclaselor acesteia).
Clasa B reprezintă clasa derivată (este o particularizare, o specializare a clasei A)
care extinde funcţionalitatea clasei de bază şi conţine informaţiile specifice.
Să presupunem că A reprezintă clasa mamiferelor (cu proprietăţile caracteristice:
nasc pui vii, au sânge cald, îşi alăptează puii, etc), iar B reprezintă clasa
animalelor domestice. În momentul definirii clasei derivate B, aceasta moşteneşte
toate caracteristicile clasei A, rămânând de specificat doar trăsăturile distinctive.
În acest caz, A este clasă de bază, iar B clasă derivată (subclasă a clasei A).
Sau: B este clasă, iar A este o superclasă a clasei B.
Moştenirea poate fi: unică sau multiplă.

A

B

Figura 9.1. Relaţia
clasă de bază-clasă
derivată

9.3.1. MOŞTENIREA UNICĂ
În cazul moştenirii unice, fiecare clasă are doar o superclasă. Există două modalităţi de specializare a unei
clase de bază:
 introducerea de extra-atribute şi extra-metode în clasa derivată (particulare doar clasei derivate);
 redefinirea membrilor în clase derivate (polimorfism).

9.3.2. MOŞTENIREA MULTIPLĂ
130
CAPITOLUL 9
obiect

Concepte de bază ale programării orientate

În situaţia moştenirii multiple, o clasă are mai multe superclase. Astfel, moştenirea clasei va fi multiplă
(rezultând o structură de reţea).
A

A

B

E

C

F

B

D

G

C

F

E

H

D

Figura 9.3. Moştenirea multiplă

Figura 9.2. Moştenirea simplă (unică)

Moştenirea multiplă este utilă, dar poate crea ambiguităţi (când pentru acelaşi atribut se moştenesc valori
diferite). Există mai multe strategii de rezolvare a conflictului (părintele cel mai apropiat, cel mai depărtat,
etc.). Deasemenea, este posibilă o moştenire repetată, în care o clasă ajunge să moştenească de la aceeaşi
clasă, pe drumuri diferite în reţea (vezi figura 9.3., în care clasa E moşteneşte de la aceeaşi clasă A, pe
drumurile A-B-E, A-C-E) . Aşa cum vedea în capitolele următoare, în aceste situaţii, limbajul C++ oferă
programatorului două strategii: 1) clasa E poate avea două copii ale lui A, una pentru fiecare drum; 2) clasa
E are o singură copie, iar A este clasă virtuală de bază şi pentru C şi pentru B. Ideea moştenirii multiple
poate duce la utilizarea unor clase pentru care nu există instanţe, care să ajute doar la organizarea structurii
(reţelei) de moştenire. În plus, limbajul C++ permite un control puternic asupra atributelor şi metodelor care
vor fi moştenite.

9.4. ÎNCAPSULAREA (ASCUNDEREA) INFORMAŢIEI
Încapsularea (ascunderea) informaţiei reflectă faptul că atributele instanţă şi metodele unui obiect îl
definesc doar pe acesta. Vom spune că metodele şi atributele unui obiect sunt “private”, încapsulate în
obiect. Interfaţa cu obiectul relevă foarte puţin din ceea ce se petrece în interiorul lui. Obiectul deţine
controlul asupra atributelor instanţă, care nu pot fi alterate de către alte obiecte. Excepţia de la această
observaţie o reprezintă doar atributele de clasă care nu sunt încapsulate, fiind partajate între toate instanţele
clasei. Această tehnică de "plasare" a valorilor în datele membre private ale obiectului, reprezintă un
mecanism de ascundere a datelor.
În limbajul C++ încapsularea poate fi forţată prin controlul accesului, deoarece toate datele şi funcţiile
membre sunt caracterizate printr-un nivel de acces (rezultând astfel o mare flexibilitate). Nivelul de acces la
membrii unei clase poate fi (figura 9.4.):
public








protected

private: membrii (date şi metode) la care
accesul este private pot fi accesaţi doar prin
metodele clasei (nivel acces implicit);
protected: aceşti membri pot fi accesaţi
prin funcţiile membre ale clasei şi funcţiile
membre ale clasei derivate;
public: membrii la care accesul este
public pot fi accesaţi din orice punct al
domeniului de existenţă a clasei respective;
friend: aceşti membri pot fi accesaţi prin
funcţiile membre ale funcţiei prietene
specificate.

Clasa A

private

clasă derivată

Clasa B

Figura 9.4. Accesul la membrii unei clase
131
CAPITOLUL 9
obiect

Concepte de bază ale programării orientate

În limbajul C++, nivelul de acces poate preciza şi tipul de moştenire (capitolul 12).
 Publică, unde în clasa derivată nivelul de acces al membrilor este acelaşi ca în clasa de bază;
 Privată, unde membrii protected şi public din clasa bază devin private în clasa derivată.

9.5. LEGAREA DINAMICĂ (“TÂRZIE”)
Obiectele unei clase părinte trebuie cunoscute în momentul compilării. Efectul combinat al moştenirii poate
determina ca o anumită metodă să fie specializată diferit (prin redefinire), pentru subclase diferite.
Polimorfismul reprezintă comportamente diferite ale unei metode în raport cu tipul unui obiect. Selectarea
unei metode redefinite poate fi realizată în faza de compilare (legarea iniţială), sau în momentul execuţiei
(legare târzie). În limbajul C++, legarea dinamică se poate realiza prin implementarea de:
 funcţii virtuale (pot fi redefinite polimorfic);
 funcţii virtuale pure (doar declarate, nu definite).

9.6. ALTE ASPECTE
Comunicarea între obiecte
În limbajele de programare orientate obiect, obiectele comunică între ele prin mesaje, ceea ce conduce la
accentuarea conceptului de încapsulare. Un obiect poate “stimula” un altul să activeze (declanşeze) o
metodă, trimiţându-i un mesaj. După primirea mesajului, metoda respectivă este apelată cu parametrii
furnizaţi, asigurând comportarea corespunzătoare a obiectelor. Metodele sunt invocate prin trimiterea de
mesaje.
În limbajul C++ funcţiile membre (metodele) sunt accesate în mod similar oricarei funcţii, cu deosebirea
că este necesară specificarea obiectului căruia îi corespunde metoda.


Pseudovariabile
Limbajele de programare orientate obiect posedă două variabile (numite pseudo-variabile) care diferă de
variabilele normale prin faptul că nu li se pot atribui valori în mod direct, de către programator. În general,
pseudovariabilele sunt o formă scurtă pentru “obiectul curent ” şi pentru “clasa părinte a obiectului
curent”. În limbajul C++ există doar una din aceste pseudovariabile, numită ”this” (pointer către obiectul
curent).


Metaclasele
Metaclasele reprezintă “clase de clase”. O clasă este, de fapt, o instanţă a unei metaclase. Diferenţele dintre
clase şi metaclase sunt:
 Clasa defineşte caracteristici (atribute şi metode) ale instanţelor de acel tip. Metodele pot fi folosite
doar de obiectele clasei, nu şi de însăşi clasa (restricţie).
 Metaclasele furnizează un mijloc prin care variabilele clasă pot fi implementate: în unele limbaje
OOP, variabilele clasă sunt instanţieri ale unei metaclase.


Limbajul C++ nu include explicit metaclasele, dar suportă variabilele clasă sub forma datelor statice. Aşa
cum funcţiile membre obişnuite sunt încapsulate înăuntrul fiecarei instanţe, pentru o funcţie membru statică
a unei clase, se foloseşte o singură copie, partajată de către toate instanţele clasei. O asemenea funcţie nu este
asociată unei anumite instanţe.
Persistenţa
Persistenţa reprezintă timpul de viaţă al unui obiect (între crearea obiectului şi ştergerea sa). Instanţele unei
clase au un timp de viaţă dat de execuţia unei metode sau a unui bloc, de crearea sau ştergerea specificată
explicit în program sau de durata întregului program. Persistenţa obiectelor este importantă în special în
aplicaţiile de baze de date.


Supraîncarcarea operatorilor.
Limbajul C++ furnizează modalităţi de supraîncarcare a operatorilor (overloading): acelaşi operator are
semnificaţii diferite, care depind de numărul şi tipul argumentelor.


132

Mais conteúdo relacionado

Destaque

Cyprus recycling and ecological footprints
Cyprus recycling and ecological footprintsCyprus recycling and ecological footprints
Cyprus recycling and ecological footprints
mariainmacula
 

Destaque (20)

Kalendarz 2015 - kiedy najlepiej brać urlop
Kalendarz 2015 - kiedy najlepiej brać urlopKalendarz 2015 - kiedy najlepiej brać urlop
Kalendarz 2015 - kiedy najlepiej brać urlop
 
Flats in bhiwadi 9.5 lacs onwards
Flats  in bhiwadi 9.5 lacs onwardsFlats  in bhiwadi 9.5 lacs onwards
Flats in bhiwadi 9.5 lacs onwards
 
Cap11
Cap11Cap11
Cap11
 
Infografika gp
Infografika gpInfografika gp
Infografika gp
 
Ile kosztuje firmę nieudana rekrutacja?
Ile kosztuje firmę nieudana rekrutacja?Ile kosztuje firmę nieudana rekrutacja?
Ile kosztuje firmę nieudana rekrutacja?
 
Elazino funtzinoa
Elazino funtzinoaElazino funtzinoa
Elazino funtzinoa
 
Year 10 pitch presentation (1)
Year 10 pitch presentation (1)Year 10 pitch presentation (1)
Year 10 pitch presentation (1)
 
Social media w rekrutacji
Social media w rekrutacjiSocial media w rekrutacji
Social media w rekrutacji
 
Web 2.0
Web 2.0Web 2.0
Web 2.0
 
Czy drzemka w pracy jest możliwa?
Czy drzemka w pracy jest możliwa?Czy drzemka w pracy jest możliwa?
Czy drzemka w pracy jest możliwa?
 
Cyprus recycling and ecological footprints
Cyprus recycling and ecological footprintsCyprus recycling and ecological footprints
Cyprus recycling and ecological footprints
 
Портфолио Cемелев Алексей Александрович педагог дополнительного образования М...
Портфолио Cемелев Алексей Александрович педагог дополнительного образования М...Портфолио Cемелев Алексей Александрович педагог дополнительного образования М...
Портфолио Cемелев Алексей Александрович педагог дополнительного образования М...
 
Cuprins
CuprinsCuprins
Cuprins
 
Wybuduj zjeżdżalnię! O silnej marce pracodawcy
Wybuduj zjeżdżalnię! O silnej marce pracodawcyWybuduj zjeżdżalnię! O silnej marce pracodawcy
Wybuduj zjeżdżalnię! O silnej marce pracodawcy
 
Jak pracownicy oceniają pracodawców - infografika
Jak pracownicy oceniają pracodawców - infografikaJak pracownicy oceniają pracodawców - infografika
Jak pracownicy oceniają pracodawców - infografika
 
Laboratory balances
Laboratory balances Laboratory balances
Laboratory balances
 
A presentation that highlights how to harness energy from waste materials
A presentation that highlights how to harness energy from waste materialsA presentation that highlights how to harness energy from waste materials
A presentation that highlights how to harness energy from waste materials
 
GoldenLine – największa baza kandydatów w Polsce
GoldenLine – największa baza kandydatów w PolsceGoldenLine – największa baza kandydatów w Polsce
GoldenLine – największa baza kandydatów w Polsce
 
Rok 2014 w liczbach
Rok 2014 w liczbachRok 2014 w liczbach
Rok 2014 w liczbach
 
Scimakelatex.93126.cocoon.bobbin
Scimakelatex.93126.cocoon.bobbinScimakelatex.93126.cocoon.bobbin
Scimakelatex.93126.cocoon.bobbin
 

Semelhante a Cap09 (9)

Cap12
Cap12Cap12
Cap12
 
AGREGARE SI MOSTENIRE.pdf
AGREGARE SI MOSTENIRE.pdfAGREGARE SI MOSTENIRE.pdf
AGREGARE SI MOSTENIRE.pdf
 
Proiect tic a_2b_popescu_eugen
Proiect tic a_2b_popescu_eugenProiect tic a_2b_popescu_eugen
Proiect tic a_2b_popescu_eugen
 
UML
UMLUML
UML
 
Cap07
Cap07Cap07
Cap07
 
C09 uml
C09 umlC09 uml
C09 uml
 
Introducere baza de-date
Introducere baza de-dateIntroducere baza de-date
Introducere baza de-date
 
Practici comune pentru limbajul de programare în C
Practici comune pentru limbajul de programare în CPractici comune pentru limbajul de programare în C
Practici comune pentru limbajul de programare în C
 
1 proiect gener
1 proiect gener1 proiect gener
1 proiect gener
 

Mais de Georgiana Loredana (10)

Most
MostMost
Most
 
Introd
IntrodIntrod
Introd
 
Cap08
Cap08Cap08
Cap08
 
Cap06
Cap06Cap06
Cap06
 
Cap05
Cap05Cap05
Cap05
 
Cap04
Cap04Cap04
Cap04
 
Cap02
Cap02Cap02
Cap02
 
Bibl
BiblBibl
Bibl
 
Cap13
Cap13Cap13
Cap13
 
Cultura organizationala
Cultura organizationalaCultura organizationala
Cultura organizationala
 

Cap09

  • 1. CAPITOLUL 9 obiect Concepte de bază ale programării orientate CONCEPTE DE BAZĂ ALE PROGRAMĂRII ORIENTATE OBIECT 9.1. Introducere 9.2. Abstractizarea datelor 9.3. Moştenirea 9 9.4. Încapsularea informaţiei 9.5. Legarea dinamică (târzie) 9.6. Alte aspecte 9.1. INTRODUCERE Termenul "OOP" ("Object Oriented Programming") desemnează disciplina programării obiectuale (orientate-obiect). Această disciplină care are la bază ideea unificării datelor cu modalităţile de prelucrare a acestora şi manevrează entităţi reprezentate sub formă de obiecte (obiect=date+cod de tratare a acestor date). Aşa cum s-a subliniat în capitolul 1.3., rezolvarea unei probleme se poate face pe 3 direcţii:  Rezolvarea orientată pe algoritm (pe acţiune), în care organizarea datelor este neesenţială;  Rezolvarea orientată pe date, acţiunile fiind determinate doar de organizarea datelor;  Rezolvarea orientată obiect, care combină tendinţele primelor două abordări. Programarea obiectuală oferă posibilităţi de modelare a obiectelor, a proprietăţilor şi a relaţiilor dintre ele, dar şi posibilitatea de a descompune o problemă în componentele sale (soft mai mentenabil, adaptabil, reciclabil). Câteva exemple de limbaje de programare orientată obiect: SIMULA(1965), SIMULA-2(1967), Smalltalk, C++, Java (în plus, Java poate fi considerat un limbaj de programare orientată eveniment). Facilităţile oferite de programarea orientată obiect (conform lui Pascou) sunt: 1. abstractizarea datelor; 2. moştenirea; 3. încapsularea (ascunderea) informaţiei; 4. legarea dinamică (“târzie”). 9.2. ABSTRACTIZAREA DATELOR Obiectele sunt componente software care modelează fenomene din lumea reală. În general, un fenomen implică tipuri diferite de obiecte. Obiectele care reprezintă aceeaşi idee sau concept sunt de acelaşi tip şi pot fi grupate în clase (concrete sau abstracte). Clasele implementează tipuri de date (aşa cum s-a subliniat în capitolul 2, un tip de date înseamnă o mulţime de valori pentru care s-a adoptatat un anumit mod de reprezentare şi o muţime de operatori care pot fi aplicaţi acestor valori), deci şi operatorii destinaţi manipulării acestora: Clasă = Date + Operaţii. De exemplu, programatorul îşi poate defini tipul (clasa) matrice şi operatorii care pot fi aplicaţi matricilor (* pentru înmulţirea a două matrici, + pentru adunarea a două matrici, - pentru scăderea a două matrici, etc). Astfel, el poate folosi tipul matrice în mod similar unui tip predefinit: matrice A, B; matrice C=A+B; Tipul unui obiect (şablon al obiectului) este o clasă. O clasă se caracterizează prin: numele clasei, atribute, funcţii şi relaţii cu alte clase. Instanţa este un obiect dintr-o clasă ( A, B, C sunt obiecte, instanţe ale clasei matrice) şi are proprietăţile definite de clasă. Pentru o clasă definită, se pot crea mai multe instanţe ale acesteia. Toate obiectele au o stare şi un comportament. Starea unui obiect se referă la elementele de date conţinute în obiect şi la 129
  • 2. CAPITOLUL 9 obiect Concepte de bază ale programării orientate valorile asociate acestora (datele membre). Comportamentul unui obiect este determinat de care acţiunile pe care obiectul poate să le execute (metodele). Atributele specificate în definiţia unei clase descriu valoric proprietăţile obiectelor din clasă, sub diferite aspecte. Cele mai multe limbaje orientate obiect fac următoarea distincţie între atribute:  atribute ale clasei (au aceeaşi valoare pentru toate instanţele clasei);  atribute ale instanţei (variază de la o instanţă la alta, fiecare instanţă având propria copie a atributului). În limbajul C++ atributele se numesc date membre. Toate datele membre sunt atribute instanţă. Atributele de clasă se pot obţine în cazul datelor membre statice (aceeaşi adresă de memorare pentru orice instanţă a clasei). Metode (funcţii membre). La definirea unei clase se definesc şi metodele acesteia (numite şi funcţii membre). Fiecare obiect are acces la un set de funcţii care descriu operaţiile care pot fi executate asupra lui. Metodele pot fi folosite de instanţele clasei respective, dar şi de instanţele altor clase (prin mecanismul moştenirii). Clasa conţine atât structurile de date necesare descrierii unui obiect, cât şi metodele care pot fi aplicate obiectului. Astfel, gradul de abstractizare este, mult mai ridicat, iar programele devin mult mai uşor de înţeles, depanat sau întreţinut. La crearea unui obiect, alocarea memoriei se poate fi face static sau dinamic (cu ajutorul unor funcţii membre speciale, numite constructori). Eliberarea memoriei se realizează cu ajutorul unor funcţii membre speciale, numite destructori, în momentul încheierii existenţei obiectului respectiv. 9.3. MOŞTENIREA Moştenirea este o caracteristică a limbajelor de programare orientate obiect, care permite refolosirea codului şi extinderea funcţionalităţii claselor existente. Între două clase pot exista multe diferenţe, dar şi multe asemănări. Este bine ca informaţia comună unor clase să fie specificată o singură dată (conceptul de clasă/subclasă, superclasă/clasă în OOP). Mecanismul moştenirii permite crearea unei ierarhii de clase şi trecerea de la clasele generale la cele particulare. Procesul implică la început definirea clasei de bază care stabileşte calităţile comune ale tuturor obiectelor ce vor deriva din bază (ierarhic superioară)(figura 9.1.). Prin moştenire, un obiect poate prelua proprietăţile obiectelor din clasa de bază. Clasa A reprezintă clasa de bază (este o generalizare) şi conţine informaţiile comune (disponibile prin moştenire şi subclaselor acesteia). Clasa B reprezintă clasa derivată (este o particularizare, o specializare a clasei A) care extinde funcţionalitatea clasei de bază şi conţine informaţiile specifice. Să presupunem că A reprezintă clasa mamiferelor (cu proprietăţile caracteristice: nasc pui vii, au sânge cald, îşi alăptează puii, etc), iar B reprezintă clasa animalelor domestice. În momentul definirii clasei derivate B, aceasta moşteneşte toate caracteristicile clasei A, rămânând de specificat doar trăsăturile distinctive. În acest caz, A este clasă de bază, iar B clasă derivată (subclasă a clasei A). Sau: B este clasă, iar A este o superclasă a clasei B. Moştenirea poate fi: unică sau multiplă. A B Figura 9.1. Relaţia clasă de bază-clasă derivată 9.3.1. MOŞTENIREA UNICĂ În cazul moştenirii unice, fiecare clasă are doar o superclasă. Există două modalităţi de specializare a unei clase de bază:  introducerea de extra-atribute şi extra-metode în clasa derivată (particulare doar clasei derivate);  redefinirea membrilor în clase derivate (polimorfism). 9.3.2. MOŞTENIREA MULTIPLĂ 130
  • 3. CAPITOLUL 9 obiect Concepte de bază ale programării orientate În situaţia moştenirii multiple, o clasă are mai multe superclase. Astfel, moştenirea clasei va fi multiplă (rezultând o structură de reţea). A A B E C F B D G C F E H D Figura 9.3. Moştenirea multiplă Figura 9.2. Moştenirea simplă (unică) Moştenirea multiplă este utilă, dar poate crea ambiguităţi (când pentru acelaşi atribut se moştenesc valori diferite). Există mai multe strategii de rezolvare a conflictului (părintele cel mai apropiat, cel mai depărtat, etc.). Deasemenea, este posibilă o moştenire repetată, în care o clasă ajunge să moştenească de la aceeaşi clasă, pe drumuri diferite în reţea (vezi figura 9.3., în care clasa E moşteneşte de la aceeaşi clasă A, pe drumurile A-B-E, A-C-E) . Aşa cum vedea în capitolele următoare, în aceste situaţii, limbajul C++ oferă programatorului două strategii: 1) clasa E poate avea două copii ale lui A, una pentru fiecare drum; 2) clasa E are o singură copie, iar A este clasă virtuală de bază şi pentru C şi pentru B. Ideea moştenirii multiple poate duce la utilizarea unor clase pentru care nu există instanţe, care să ajute doar la organizarea structurii (reţelei) de moştenire. În plus, limbajul C++ permite un control puternic asupra atributelor şi metodelor care vor fi moştenite. 9.4. ÎNCAPSULAREA (ASCUNDEREA) INFORMAŢIEI Încapsularea (ascunderea) informaţiei reflectă faptul că atributele instanţă şi metodele unui obiect îl definesc doar pe acesta. Vom spune că metodele şi atributele unui obiect sunt “private”, încapsulate în obiect. Interfaţa cu obiectul relevă foarte puţin din ceea ce se petrece în interiorul lui. Obiectul deţine controlul asupra atributelor instanţă, care nu pot fi alterate de către alte obiecte. Excepţia de la această observaţie o reprezintă doar atributele de clasă care nu sunt încapsulate, fiind partajate între toate instanţele clasei. Această tehnică de "plasare" a valorilor în datele membre private ale obiectului, reprezintă un mecanism de ascundere a datelor. În limbajul C++ încapsularea poate fi forţată prin controlul accesului, deoarece toate datele şi funcţiile membre sunt caracterizate printr-un nivel de acces (rezultând astfel o mare flexibilitate). Nivelul de acces la membrii unei clase poate fi (figura 9.4.): public     protected private: membrii (date şi metode) la care accesul este private pot fi accesaţi doar prin metodele clasei (nivel acces implicit); protected: aceşti membri pot fi accesaţi prin funcţiile membre ale clasei şi funcţiile membre ale clasei derivate; public: membrii la care accesul este public pot fi accesaţi din orice punct al domeniului de existenţă a clasei respective; friend: aceşti membri pot fi accesaţi prin funcţiile membre ale funcţiei prietene specificate. Clasa A private clasă derivată Clasa B Figura 9.4. Accesul la membrii unei clase 131
  • 4. CAPITOLUL 9 obiect Concepte de bază ale programării orientate În limbajul C++, nivelul de acces poate preciza şi tipul de moştenire (capitolul 12).  Publică, unde în clasa derivată nivelul de acces al membrilor este acelaşi ca în clasa de bază;  Privată, unde membrii protected şi public din clasa bază devin private în clasa derivată. 9.5. LEGAREA DINAMICĂ (“TÂRZIE”) Obiectele unei clase părinte trebuie cunoscute în momentul compilării. Efectul combinat al moştenirii poate determina ca o anumită metodă să fie specializată diferit (prin redefinire), pentru subclase diferite. Polimorfismul reprezintă comportamente diferite ale unei metode în raport cu tipul unui obiect. Selectarea unei metode redefinite poate fi realizată în faza de compilare (legarea iniţială), sau în momentul execuţiei (legare târzie). În limbajul C++, legarea dinamică se poate realiza prin implementarea de:  funcţii virtuale (pot fi redefinite polimorfic);  funcţii virtuale pure (doar declarate, nu definite). 9.6. ALTE ASPECTE Comunicarea între obiecte În limbajele de programare orientate obiect, obiectele comunică între ele prin mesaje, ceea ce conduce la accentuarea conceptului de încapsulare. Un obiect poate “stimula” un altul să activeze (declanşeze) o metodă, trimiţându-i un mesaj. După primirea mesajului, metoda respectivă este apelată cu parametrii furnizaţi, asigurând comportarea corespunzătoare a obiectelor. Metodele sunt invocate prin trimiterea de mesaje. În limbajul C++ funcţiile membre (metodele) sunt accesate în mod similar oricarei funcţii, cu deosebirea că este necesară specificarea obiectului căruia îi corespunde metoda.  Pseudovariabile Limbajele de programare orientate obiect posedă două variabile (numite pseudo-variabile) care diferă de variabilele normale prin faptul că nu li se pot atribui valori în mod direct, de către programator. În general, pseudovariabilele sunt o formă scurtă pentru “obiectul curent ” şi pentru “clasa părinte a obiectului curent”. În limbajul C++ există doar una din aceste pseudovariabile, numită ”this” (pointer către obiectul curent).  Metaclasele Metaclasele reprezintă “clase de clase”. O clasă este, de fapt, o instanţă a unei metaclase. Diferenţele dintre clase şi metaclase sunt:  Clasa defineşte caracteristici (atribute şi metode) ale instanţelor de acel tip. Metodele pot fi folosite doar de obiectele clasei, nu şi de însăşi clasa (restricţie).  Metaclasele furnizează un mijloc prin care variabilele clasă pot fi implementate: în unele limbaje OOP, variabilele clasă sunt instanţieri ale unei metaclase.  Limbajul C++ nu include explicit metaclasele, dar suportă variabilele clasă sub forma datelor statice. Aşa cum funcţiile membre obişnuite sunt încapsulate înăuntrul fiecarei instanţe, pentru o funcţie membru statică a unei clase, se foloseşte o singură copie, partajată de către toate instanţele clasei. O asemenea funcţie nu este asociată unei anumite instanţe. Persistenţa Persistenţa reprezintă timpul de viaţă al unui obiect (între crearea obiectului şi ştergerea sa). Instanţele unei clase au un timp de viaţă dat de execuţia unei metode sau a unui bloc, de crearea sau ştergerea specificată explicit în program sau de durata întregului program. Persistenţa obiectelor este importantă în special în aplicaţiile de baze de date.  Supraîncarcarea operatorilor. Limbajul C++ furnizează modalităţi de supraîncarcare a operatorilor (overloading): acelaşi operator are semnificaţii diferite, care depind de numărul şi tipul argumentelor.  132