Documente Academic
Documente Profesional
Documente Cultură
Capitolul 9
Capitolul 9
9.1. INTRODUCERE
Termenul "OOP" ("Object Oriented Programming") desemneaz disciplina programrii obiectuale
(orientate-obiect). Aceast disciplin care are la baz ideea unificrii datelor cu modalitile de prelucrare a
acestora i manevreaz entiti reprezentate sub form de obiecte (obiect=date+cod de tratare a acestor date).
Aa cum s-a subliniat n capitolul 1.3., rezolvarea unei probleme se poate face pe 3 direcii:
Rezolvarea orientat pe algoritm (pe aciune), n care organizarea datelor este neesenial;
Rezolvarea orientat pe date, aciunile fiind determinate doar de organizarea datelor;
Rezolvarea orientat obiect, care combin tendinele primelor dou abordri.
Programarea obiectual ofer posibiliti de modelare a obiectelor, a proprietilor i a relaiilor dintre ele,
dar i posibilitatea de a descompune o problem n componentele sale (soft mai mentenabil, adaptabil,
reciclabil). Cteva 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).
Facilitile oferite de programarea orientat obiect (conform lui Pascou) sunt:
1. abstractizarea datelor;
2. motenirea;
3. ncapsularea (ascunderea) informaiei;
4. legarea dinamic (trzie).
Tipul unui obiect (ablon al obiectului) este o clas. O clas se caracterizeaz prin: numele clasei, atribute,
funcii i relaii cu alte clase.
Instana este un obiect dintr-o clas (A, B, C sunt obiecte, instane ale clasei matrice) i are proprietile
definite de clas. Pentru o clas definit, se pot crea mai multe instane ale acesteia. Toate obiectele au o
stare i un comportament. Starea unui obiect se refer la elementele de date coninute n obiect i la
valorile asociate acestora (datele membre). Comportamentul unui obiect este determinat de care aciunile pe
care obiectul poate s le execute (metodele).
129
CAPITOLUL 9
Atributele specificate n definiia unei clase descriu valoric proprietile obiectelor din clas, sub diferite
aspecte. Cele mai multe limbaje orientate obiect fac urmtoarea distincie ntre atribute:
atribute ale clasei (au aceeai valoare pentru toate instanele clasei);
atribute ale instanei (variaz de la o instan la alta, fiecare instan avnd propria copie a
atributului).
n limbajul C++ atributele se numesc date membre. Toate datele membre sunt atribute instan. Atributele
de clas se pot obine n cazul datelor membre statice (aceeai adres de memorare pentru orice instan a
clasei).
Metode (funcii membre). La definirea unei clase se definesc i metodele acesteia (numite i funcii
membre). Fiecare obiect are acces la un set de funcii care descriu operaiile care pot fi executate asupra lui.
Metodele pot fi folosite de instanele clasei respective, dar i de instanele altor clase (prin mecanismul
motenirii).
Clasa conine att structurile de date necesare descrierii unui obiect, ct i metodele care pot fi aplicate
obiectului. Astfel, gradul de abstractizare este, mult mai ridicat, iar programele devin mult mai uor de
neles, depanat sau ntreinut.
La crearea unui obiect, alocarea memoriei se poate fi face static sau dinamic (cu ajutorul unor funcii
membre speciale, numite constructori). Eliberarea memoriei se realizeaz cu ajutorul unor funcii membre
speciale, numite destructori, n momentul ncheierii existenei obiectului respectiv.
9.3. MOTENIREA
Motenirea este o caracteristic a limbajelor de programare orientate obiect, care permite refolosirea codului
i extinderea funcionalitii claselor existente. ntre dou clase pot exista multe diferene, dar i multe
asemnri. Este bine ca informaia comun unor clase s fie specificat o singur dat (conceptul de
clas/subclas, superclas/clas n OOP). Mecanismul motenirii permite crearea unei ierarhii de clase i
trecerea de la clasele generale la cele particulare. Procesul implic la nceput definirea clasei de baz care
stabilete calitile comune ale tuturor obiectelor ce vor deriva din baz (ierarhic superioar)(figura 9.1.).
Prin motenire, un obiect poate prelua proprietile obiectelor din clasa de baz.
Clasa A reprezint clasa de baz (este o generalizare) i conine informaiile
comune (disponibile prin motenire i subclaselor acesteia).
Clasa B reprezint clasa derivat (este o particularizare, o specializare a clasei A)
care extinde funcionalitatea clasei de baz i conine informaiile specifice.
S presupunem c A reprezint clasa mamiferelor (cu proprietile caracteristice:
nasc pui vii, au snge cald, i alpteaz puii, etc), iar B reprezint clasa
animalelor domestice. n momentul definirii clasei derivate B, aceasta motenete
toate caracteristicile clasei A, rmnnd de specificat doar trsturile 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.
Motenirea poate fi: unic sau multipl.
CAPITOLUL 9
Motenirea multipl este util, dar poate crea ambiguiti (cnd pentru acelai atribut se motenesc valori
diferite). Exist mai multe strategii de rezolvare a conflictului (printele cel mai apropiat, cel mai deprtat,
etc.). Deasemenea, este posibil o motenire repetat, n care o clas ajunge s moteneasc de la aceeai
clas, pe drumuri diferite n reea (vezi figura 9.3., n care clasa E motenete de la aceeai clas A, pe
drumurile A-B-E, A-C-E) . Aa cum vedea n capitolele urmtoare, n aceste situaii, 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 motenirii multiple poate
duce la utilizarea unor clase pentru care nu exist instane, care s ajute doar la organizarea structurii
(reelei) de motenire. n plus, limbajul C++ permite un control puternic asupra atributelor i metodelor care
vor fi motenite.
protected
Clasa A
private
clas derivat
Clasa B
CAPITOLUL 9
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 ctre programator. n general,
pseudovariabilele sunt o form scurt pentru obiectul curent i pentru clasa printe a obiectului
curent. n limbajul C++ exist doar una din aceste pseudovariabile, numit this (pointer ctre obiectul
curent).
Metaclasele
Metaclasele reprezint clase de clase. O clas este, de fapt, o instan a unei metaclase. Diferenele dintre
clase i metaclase sunt:
Clasa definete caracteristici (atribute i metode) ale instanelor de acel tip. Metodele pot fi folosite
doar de obiectele clasei, nu i de nsi clasa (restricie).
Metaclasele furnizeaz un mijloc prin care variabilele clas pot fi implementate: n unele limbaje
OOP, variabilele clas sunt instanieri ale unei metaclase.
Limbajul C++ nu include explicit metaclasele, dar suport variabilele clas sub forma datelor statice. Aa
cum funciile membre obinuite sunt ncapsulate nuntrul fiecarei instane, pentru o funcie membru static
a unei clase, se folosete o singur copie, partajat de ctre toate instanele clasei. O asemenea funcie nu este
asociat unei anumite instane.
Persistena
Persistena reprezint timpul de via al unui obiect (ntre crearea obiectului i tergerea sa). Instanele unei
clase au un timp de via dat de execuia unei metode sau a unui bloc, de crearea sau tergerea specificat
explicit n program sau de durata ntregului program. Persistena obiectelor este important n special n
aplicaiile de baze de date.
Suprancarcarea operatorilor.
Limbajul C++ furnizeaz modaliti de suprancarcare a operatorilor (overloading): acelai operator are
semnificaii diferite, care depind de numrul i tipul argumentelor.
132