Concepte de baza ale programarii orientate obiect
Programarea obiectuala ofera posibilitati de modelare a obiectelor, a proprietatilor si a relatiilor dintre ele, dar si posibilitatea de a descompune o problema în componentele sale (soft mai mentenabil, adaptabil, reciclabil). Câteva exemple de limbaje de programare orientata obiect: SIMULA(1965), SIMULA-2(1967), Smalltalk, C++, Java (în plus, Java poate fi considerat un limbaj de programare orientata eveniment).
Facilitatile oferite de programarea orientata obiect (conform lui Pascou) sunt:
Obiectele sunt componente software care modeleaza fenomene din lumea reala. În general, un fenomen implica tipuri diferite de obiecte. Obiectele care reprezinta aceeasi idee sau concept sunt de acelasi tip si pot fi grupate în clase.
Clasele implementeaza tipuri de date ( un tip de date înseamna o multime de valori pentru care s-a adoptatat un anumit mod de reprezentare si o mutime de operatori care pot fi aplicati acestor valori), deci si operatorii destinati manipularii acestora:
Clasa = Date + Operatii.
De exemplu, programatorul îsi poate defini tipul (clasa) matrice si operatorii care pot fi aplicati matricilor (* pentru înmultirea a doua matrici, + pentru adunarea a doua matrici, - pentru scaderea a doua matrici, etc). Astfel, el poate folosi tipul matrice în mod similar unui tip predefinit:
matrice A, B;
matrice C=A+B;
Tipul unui obiect este o clasa.
O clasa se caracterizeaza prin: numele clasei,
atribute, functii si relatii
cu alte clase.
Instanta este un obiect dintr-o clasa (A, B, C
sunt obiecte, instante ale clasei matrice) si are proprietatile definite de clasa. Pentru o clasa definita,
se pot crea mai multe instante ale acesteia. Toate
obiectele au o stare si un comportament.
Starea unui obiect
se refera la elementele de date continute in obiect
si la valorile asociate acestora (datele membre).
Comportamentul
unui obiect este determinat de care actiunile pe care
obiectul poate sa le execute (metodele).
Atributele specificate in definitia unei clase
descriu valoric proprietatile obiectelor din clasa,
sub diferite aspecte. Cele mai multe limbaje orientate obiect fac urmatoarea distinctie intre
atribute:
In limbajul C++ atributele se numesc date membre. Toate datele membre sunt atribute instanta. Atributele de clasa se pot obtine in cazul datelor membre statice (aceeasi adresa de memorare pentru orice instanta a clasei).
Metode (functii membre). La definirea unei clase se
definesc si metodele acesteia (numite si functii
membre). Fiecare obiect are acces la un set de functii
care descriu operatiile care pot fi executate asupra
lui. Metodele pot fi folosite de instantele clasei
respective, dar si de instantele altor clase (prin
mecanismul mostenirii).
Clasa contine atat
structurile de date necesare descrierii unui obiect, cat si metodele care pot
fi aplicate obiectului. Astfel, gradul de abstractizare este, mult mai ridicat,
iar programele devin mult mai usor de inteles, depanat sau intretinut.
La crearea unui obiect, alocarea memoriei se poate fi face cu ajutorul unor functii membre speciale, numite constructori. Eliberarea memoriei se realizeaza cu ajutorul unor functii membre speciale, numite destructori, in momentul incheierii existentei obiectului respectiv.
Mostenirea este o caracteristica a limbajelor de programare orientate obiect, care permite refolosirea codului si extinderea functionalitatii claselor existente. Intre doua clase pot exista multe diferente, dar si multe asemanari. Este bine ca informatia comuna unor clase sa fie specificata o singura data (conceptul de clasa/subclasa, superclasa/clasa In OOP). Mecanismul mostenirii permite crearea unei ierarhii de clase si trecerea de la clasele generale la cele particulare. Procesul implica la inceput definirea clasei de baza care stabileste calitatile comune ale tuturor obiectelor ce vor deriva din baza (ierarhic superioara) Prin mostenire, un obiect poate prelua proprietatile obiectelor din clasa de baza.
Clasa de baza se mai numeste si
superclasa, iar clasele derivate se numesc si subclase.
Fiecare clasa derivata mosteneste campurile
si metodele superclasei. Aceasta inseamna ca toate campurile si metodele existente in superclasa sunt
utilizabile si in clasa derivata, dar in aceasta din urma pot exista, de asemenea,
campuri si/sau metode suplimentare.
Clasa A reprezinta
clasa de baza (este o generalizare) si contine informatiile comune (disponibile prin mostenire
si subclaselor acesteia). |
|
Incapsularea (ascunderea) informatiei reflecta faptul ca atributele instanta si metodele unui obiect il definesc doar pe acesta. Vom spune ca metodele si atributele unui obiect sunt “private”, incapsulate in obiect. Interfata cu obiectul releva foarte putin din ceea ce se petrece in interiorul lui. Obiectul detine controlul asupra atributelor instanta, care nu pot fi alterate de catre alte obiecte. Exceptia de la aceasta observatie o reprezinta doar atributele de clasa care nu sunt incapsulate, fiind partajate intre toate instantele clasei. Aceasta tehnica de "plasare" a valorilor in datele membre private ale obiectului, reprezinta un mecanism de ascundere a datelor.
In limbajul C++ Incapsularea poate fi fortata prin controlul accesului, deoarece toate datele si functiile membre sunt caracterizate printr-un nivel de acces (rezultand astfel o mare flexibilitate).
Nivelul de acces la membrii unei clase poate fi:
In limbajul C++, nivelul de acces poate preciza si tipul de mostenire :
Publica, unde In clasa derivata nivelul de acces al
membrilor este acelasi ca In clasa de baza;
Privata, unde membrii protected si public din
clasa baza devin private In clasa derivata.
Obiectele unei clase parinte
trebuie cunoscute in momentul compilarii. Efectul
combinat al mostenirii poate determina ca o anumita
metoda sa fie specializata diferit (prin redefinire), pentru subclase diferite.
Polimorfismul reprezinta
comportamente diferite ale unei metode in raport cu tipul unui obiect.
Selectarea unei metode redefinite poate fi realizata in faza de compilare
(legarea initiala), sau In momentul executiei (legare tarzie). In
limbajul C++, legarea dinamica se poate realiza prin implementarea de:
functii virtuale (pot fi redefinite polimorfic);
functii virtuale pure (doar declarate, nu definite).