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.
A
CAPITOLUL 9 A
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.
Figura 9.4. Accesul la membrii unei clase n limbajul C++, nivelul de acces poate preciza i tipul de motenire (capitolul 12). Public, unde n clasa derivat nivelul de acces al membrilor este acelai ca n clasa de baz; Privat, unde membrii protected i public din clasa baz devin private n clasa derivat.
131
private: membrii (date i metode) la care accesul este private pot fi accesai doar prin metodele clasei (nivel acces implicit); protected: aceti membri pot fi accesai prin funciile membre ale clasei i funciile membre ale clasei derivate; public: membrii la care accesul este public pot fi accesai din orice punct al domeniului de existen a clasei respective; friend: aceti membri pot fi accesai prin funciile membre ale funciei prietene specificate.
protected private
Clasa A
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