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:



    Abstractizarea datelor

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

    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).
   Clasa B reprezinta clasa derivata (este o particularizare, o specializare a clasei A) care extinde functionalitatea clasei de baza si contine informatiile specifice. 
   Sa presupunem ca A reprezinta clasa mamiferelor (cu proprietatile caracteristice: nasc pui vii, au sange cald, isi alapteaza puii, etc), iar B reprezinta clasa animalelor domestice. In momentul definirii clasei derivate B, aceasta mosteneste toate caracteristicile clasei A, ramanand  de specificat doar trasaturile distinctive.
In acest caz, A este clasa de baza, iar B clasa derivata (subclasa a clasei A).
Sau: B este clasa, iar A este o superclasa a clasei B. 
Mostenirea poate fi: unica  sau multipla.



    Incapsularea informatiei

    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.



Legarea dinamica (“târzie”)

    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).