programarea orientata pe obiecte

Upload: dubalarinicolai

Post on 06-Jul-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/18/2019 Programarea orientata pe obiecte

    1/9

    Notiuni generale despre POO. Conceptele de baza

    • Programarea orientată obiect (POO) este o metodă de proiectare ișimplementare în care programele sunt reprezentate sub forma unorcolec ii de obiecte care interac ionează între ele. În practică trebuie săț țse decidă ce clase sunt necesare, trebuie proiectat cate un set completde operaţii pentru acestea, trebuie explicitate părţile comune ale lorprin relaţia de moştenire (deriare, generalizare) şi trebuie folositpolimorfismul.

    Concepte de bază în POO

    • Abstractizarea ! capacitatea de a reprezenta concepte direct într!un

    program i de a ascunde detaliile din spate (se oferă clase şi obiecte).ș

    • Încapsulare ! capacitatea de a oferi garan ii că o abstractizare estețutilizată numai în conformitate cu specifica iile sale.ț

    • Modularitatea! "odalitate de a grupa abstractizări legate logic întreele.

    • Polimorfism ! capacitatea de a oferi aceea i interfa ă pentru obiecteș țcu implementari diferite. #onduce la simplificarea codului folosindabstrac iuni.ț

    • Moştenirea ! posibilitatea de a construi noi abstractizări pornind dela una de$a existentă. %ste una dintre cele mai puternice moduri de

    construc ie de abstrac iuni utileț ț

    • Genericele! capacitatea de parametrizare a tipurilor i func iilor prinș țtipuri i alori, fiind un instrument puternic pentru a scrie algoritmișgenerali.

  • 8/18/2019 Programarea orientata pe obiecte

    2/9

    tructura unei clase . !ate. Metode. Proprietati.

    • O clasă descrie unul sau mai multe obiecte ce pot fi precizate printr!un set uniform deatribute(date) şi metode(funcţionalitate).• Orice obiect are memoria sa proprie unde se păstrează alorile tuturor atributelor sale

    • Orice obiect are un tip

    • &n obiect este o instanţă a unei clase

    • #lasa defineşte caracteristicile i comportarea obiectelor ș

    • 'efinirea unei clase presupune

      combinarea datelor cu operaţiile ce se aplică acestora  ascunderea informaţiei

    intaxa definirii unei clase

    'efinirea unei clase constă din două părţi distincte• declararea clasei• implementarea clasei

    intaxaclass IdNumeClasa{ declaratii de date membru;

    declaratii/defini ii de functii membru; };ț 

    Protec ia datelor i func iilor membreț ș ț*uncţiile şi datele unei clase pot fi grupate din punct de edere al dreptului de acces în

    • pri"ate + conţine date şi funcţii membre care pot fi folosite doar de către celelalte funcţiiaparţinnd clasei respectie-• protected + similară cu priate dar care dă drepturi de acces şi funcţiilor membre ale claselor deriate din clasa respectie• public + drept de acces tuturor 

    !eclararea datelorclass IdNumeClasa{ tip idNumeData1[=exp1],idNumeData2[=exp2],

    ,idNumeDataN[=expN]; };

    unde tip/ reprezintă un tip de date, 0d1ume'ata2, 0d1ume'ata3, ..., 0d1ume'ata1 reprezintădenumiri alabile de ariabile iar exp2, exp3, ...,exp1 reprezintă expresii ce se ealuează i așcăror aloare este atribuită la declarare ariabilelor corespunzătoare.

    !eclararea#definirea unei metode'eclarareclass IdNumeClasa{ 

    tip idNume!et"da#tip1 p1, , tip pn$; };

    'efiniretip IdNumeClasa%% tip idNume!et"da#tip1 p1, , tip pn${

    //instructiuni }

  • 8/18/2019 Programarea orientata pe obiecte

    3/9

    Constructori si distructori

    Caracteristicile constructorilor• au acela i nume cu cel al clasei din care fac parteș

    • nu returnează nimic (nici macar tipul oid)

    • o clasă poate aea mai mul i constructoriț

    • nu pot primi ca parametri instan e ale clasei ce se define te, ci doar pointeri sauț șreferin e la instan ele clasei respectieț ț• constructorii nu sunt apelaţi explicit (in general)

    • constructorii nu se mo tenescș

    • constructori nu pot fi func ii irtualeț

    $ipuri de constructoriConstructori implici iț definit de utili&at"r  + constructor ce nu are niciun parametru  'enerat de c"mpilat"r  + daca o clasă nu are niciun constructor definit atunci

    compilatorul genereazăunul automat, fară parametri al cărui corp nucon ine nicioținstruc iuneț

     constructor cu to i parametri implici iț țConstructori cu parameteri cu parametri ce nu iau (al"ri implicite cu parametri ce iau (al"ri implicite (la apel, ace tia pot sa lipsească, caz în care ei auș

    alorile implicite specificate la declarare).Constructori de copiere Permit iniţializarea obiectelor din altele de$a existente unt defini i de utili&at"r ț    iș  'enera i de c"mpilat"r ț 

    !estructori!estructorul este o func ie membră specială a unei clase ce apelează în mod automatț

    distrugerea unui obiect. %ste definit de utilizator si generat de compilator, aand rolul dea elibera zonele alocate dinamic.class IdNumeClasa { )))

    *IdNumeClasa #$;)))};

    IdNumeClasa%%*IdNumeClasa #${

    //instructiuni}

    Caracteristici•

     4re acela i nume cu numele clasei si este precedat de 5ș• 1u are parametric

    • 1u returneaza nimic (nici macar oid)

    • O clasa poate aea un singur destructor

  • 8/18/2019 Programarea orientata pe obiecte

    4/9

    • Pot fi functii irtuale

    %unctii si clase de tipul friend*unc iile friend (prieten) sunt funcţii associate unor clase care au acces la datele şi metodelețprote$ate ale acelor clase deşi nu sunt funcţii membre ale acelei clase.6ipuri de func ii prietenț

    • func ii globaleț• func ii membre ale altor claseț

    %unc ii friend globaleț• 'eclararea unei func ii friend se face incluznd prototipul ei, precedat de cuntul c7eieț

    friend, în acea clasăclass IdClasa { 

    friend tip+ret id+functie+prieten#lista+de+parametri$;8-• 'efiniţia funcţiei se face în afara clasei

    tip+ret id+functie+prieten#lista+de+parametri$ { 

    //c"rpul de instructiuni n care a(em acces la datele pr"te-ate ale "biectel"r clasei IdClasa}%unc ii friend membre ale altor claseț

    • unt funcţii membre ale unei clase ce au acces la datele membru prote$ate aleunei alte clase.

    • 'eclararea unei func ii friend se face incluznd prototipul ei, precedat de cuntulțc7eie friend, în clasa în care se dore te accesulșclass IdClasa.; //declarare a clasei IdClasa. naintea definirii clasei IdClasa

    class IdClasa { 

    tip+ret id+functie+prieten#lista+de+parametri$; //declararea func0iei};class IdClasa. { 

    friend tip+ret IdClasa%%id+functie+prieten#lista+de+parametri$;};

    tip+ret IdClasa%%id+functie+prieten#lista+de+parametri$ { 

    //c"rpul de instructiuni n care a(em acces la datele pr"te-ate ale "biectel"r clasei IdClasa.}

    Clase friend• 'acă dorim ca toate metodele dintr!o clasă 0d#lasa9 să aibe acces asupra tuturor datelor

    membre prote$ate ale unei alte clase 0d#lasa4 atunci declarăm clasa 0d#lasa9 ca fiind

    clasă friend (prieten) pentru clasa 0d#lasa4• intaxa declarării claselor prietene este următoarea

    class IdClasa; //declarare a clasei IdClasa inaintea definirii clasei IdClasa.

    class IdClasa. { 

    friend class IdClasa;};

    :elaţia de prietenie dintre două clase nu este reflexiă'acă clasa 0d#lasa4 este clasă prieten aclasei 0d#lasa9,atunci nu şi reciproca este alabilă

    :elaţia de prietenie nu este tranzitiă dacă clasa 0d#lasa4 este clasă prietenă clasei 0d#lasa9,iar 0d#lasa9 este clasă prietenă clasei 0d#lasa#, asta nu implică faptul că 0d#lasa4 este clasă

     prietenă a clasei 0d#lasa#.:elaţia de prietenie nu se moşteneşte în clasele deriate.

  • 8/18/2019 Programarea orientata pe obiecte

    5/9

    Mostenirea simpla si multipla

    "ostenirea este o caracteristica a limba$elor de programare orientate obiect,care permite refolosirea codului si extinderea functionalitatii claselor existente.

    "ecanismul mostenirii permite crearea unei ierar7ii de clase si trecerea de laclasele generale la cele particulare. (&n concept poate fi implementat printr!oclasa). 4ceasta proprietate se manifesta prin faptul ca din orice clasa putemderia alte clase. Procesul implica la inceput definirea clasei de baza carestabileste calitatile comune ale tuturor obiectelor ce or deria din baza(ierar7ic superioara). Prin mostenire, un obiect poate prelua proprietatileobiectelor din clasa de baza.

    "ostenirea poate fi

    • impla (o clasa are doar o superclasa, rezultand o structura arborescenta)-

    • "ultipla (o clasa are mai multe superclase, rezultand o structura de retea).

    0nformatia comuna apare in clasa de baza, iar informatia specifica ! in clasa

    deriata. #lasa deriata reprezinta o specializare a clasei de baza. Orice clasaderiata mosteneste datele membru si metodele clasei de baza. 'eci acestea nutrebuie redeclarate in clasa deriata.;a modul general, la declararea unei clase deriate, se specifica o lista aclaselor de baza, precedate de modificatorul de acces care precizeaza tipulmostenirii.

    class nume+cls+deri(% m"dificat"r+de+acces nume+clasa+de+ba&a{ //c"rpul clasei deri(ate 3 elemente specifice clasei deri(ate

    };

    Daca A si B sunt doua clase, spunem ca B mosteneste pe A (B estederivata din A ori B este o specializare a lui A) daca:– clasa B are toate atributele si metodele clasei A– clasa B poate redefni metode ale clasei A

    – clasa B poate adauga noi membrii in aara celor mostenisti de la A

  • 8/18/2019 Programarea orientata pe obiecte

    6/9

    %unctii "irtuale. Clase abstracte. Polimorfizm.Cu ajutorul unciilor virtuale !i al polimorfsmului este posibil"proiectarea !i implementarea sistemelor sot#are care sunt mult maiu!or e$tensibile% &rogramele pot f concepute s" proceseze 'n modgeneric, sub orma obiectelor din clasele de baz", a obiectelor tuturorclaselor dintro ierarie% Clasele care nu e$ist" 'n timpul dezvolt"rii

    niiale a programului pot f ad"ugate ulterior cu modifc"ri minore sauciar "r" a ace modifc"ri p"rii generice a programului, at*ta timpc*t clasele sunt p"ri ale ierariei procesate generic% +ingurele p"ridin program care trebuie modifcate sunt cele care olosesc inormaiispecifce despre o clas" ad"ugat" 'n ierarie% Funcţiile virtuale+" presupunem c" avem mai multe clase care reprezint" ormegeometrice: &oint, Circle, riangle, -ectangle, +.uare derivate din clasade baz" +ape% /iecare dintre aceste clase trebuie s" permit" af!areanumelui ormei pe care o reprezint"% De!i fecare clas" are o uncieprint+ape0ame, implementarea unciei print+ape0ame pentrufecare orm" este dierit"% Ar f de dorit ca toate ormele s" poat" ftratate generic, find derivate din clasa de baz" +ape% &rin acestmecanism, pentru oricare dintre orme sar apela unciaprint+ape0ame din clasa de baz" +ape, urm*nd ca, dup" tipul de

    dat" al obiectului, programul s" determine dinamic ('n timpule$ecuiei) care dintre unciile print+ape0ame din clasele derivate seolose!te% &entru a permite acest lucru, uncia print+ape0ametrebuie declarat" virtual 'n clasa de baz", iar fecare clas" din ierariade derivare trebuie s" o suprascrie pentru ca s" implementeze uncomportament particular% Declararea unei uncii virtuale se ace prinad"ugarea cuv*ntului ceie virtual 'naintea prototipului 'n clasa de

    baz": virtual void print+ape0ame() const1Clase de bază abstracte şi clase de bază concrete

    C*nd ne g*ndim la o clas" ca la un tip de dat", ne a!tept"m ca 'naplicaiile care olosesc acea clas" s" fe instaniate obiecte ale sale%2$ist", totu!i, cazuri 'n care este util s" se declare clase pentru careprogramatorul nu are intenia s" instanieze obiecte% Acestea suntclase abstracte% Deoarece acestea sunt olosite drept clase de baz" 'nerarii de mo!tenire, obi!nuim s" le numim clase de baz" abstracte%A!adar, nu pot f instaniate obiecte din clasele de baz" abstracte%-olul unei clase abstracte este acela de a crea o clas" de baz" din carealte clase pot mo!teni interaa sau implementarea% Clasele din care

  • 8/18/2019 Programarea orientata pe obiecte

    7/9

    pot f instantiate obiecte sunt clase concrete% Clasele de baz"abstracte sunt de regul" prea generice pentru a defni obiecte reale%2ste nevoie de clase mai specifce pentru a putea justifca posiblitateade a instania obiecte% 3 clas" devine abstract" dac" una sau maimulte uncii virtuale este declarat" pur"% 3 uncie virtual" devinepur" dac" declaraia sa este urmat" de 45: virtual void earnings()const 4 51 66unctie virtuala pura Dac" o clas" este derivat" dintroclas" de baz" care conine o uncie virtual" pur" !i nu defne!te aceauncie, atunci uncia este pur" !i 'n clasa derivat", iar clasa derivat"este !i ea abstract"% 3 ierarie de clase nu trebuie s" conin" neap"ratclase abstracte% Atunci c*nd se 'nt*mpl", 'ns", acest lucru, claseleabstracte se g"sesc 'n v*rul ierariei, iar la baza ierariei sunt claseconcrete%

    Polimorfsmul7imbajul C88 oer" suport pentru polimorfsm care 'nseamn"posibilitatea ca obiecte din diverse clase care sunt legate prin relaii demo!tenire s" r"spund" dierit la acela!i mesaj, adic" la acela!i apel deuncie% &olimorfsmul este implementat prin unciile virtuale% Atuncic*nd programul cere olosirea unei uncii printrun pointer sau oreerin" la o clasa de baz", C88 alege suprascrierea corect" din clasaderivat" corespunz"toare obiectului care o apeleaz"% 9neori, o uncienonvirtual" este defnit" 'n clasa de baz" !i suprascris" 'ntro clas"derivat"% Dac" o astel de uncie membr" este apelat" printrunpointer la clasa de baz" iniializat cu adresa unui obiect al unei clasederivate, este apelat" versiunea din clasa de baz"% Dac" unciamembr" este apelat" printrun pointer la clasa derivat", este olosit"versiunea unciei din clasa derivat"% Acesta este un comportamentnonpolimorfc%

    &olimorfsmul promoveaz" e$tensibilitatea% Aplicaiile sot#are scrie 'nmanier" polimorfc" sunt independente de tipurile obiectelor c"tre carese trimit mesaje% Astel, noile tipuri de obiecte care r"spund lamesajele e$istente pot f ad"ugate 'ntrun astel de sistem "r" amodifca sistemul de baz"% Atunci c*nd codul client intaniaz", 'ns",obiecte noi, programul trebuie recompilat% Cu toate c" nu se potnstania obiecte din clasele de baz" abstracte, se pot declara pointeri

    sau reerine la aceste clase% Ace!ti pointeri sau reerine pot f utilizaipentru a permite manipul"rile polimorfce ale obiectelor din claselederivate c*nd se instaniaz" astel de obiecte din clase concrete%&olimorfsmul !i unciile virtuale sunt utile !i atunci c*nd, 'ntro az"

  • 8/18/2019 Programarea orientata pe obiecte

    8/9

    ntermediar" a proiect"rii !i implement"rii unei aplicaii sot#are, nusunt cunoscute toate clasele care vor f olosite 'n versiunea fnal"%0oile clase care sunt ad"ugate sistemului sunt integrate prin legareadinamic" (dnamic binding, numit uneori !i late binding)% ipul unuiobiect care apeleaz" o uncie virtual" nu este nevoie s" fe cunoscuta compilare% 7a rulare, uncia apelat" virtual este identifcat" cuuncia membr" din clasa c"reia 'i aparine obiectul%

  • 8/18/2019 Programarea orientata pe obiecte

    9/9

    upraincarcarea operatorilor3peratorii sunt notaii concise, inf$ate, pentru operaiimatematice uzuale% 7imbajul C88, ca orice limbaj deprogramare asigur" un set de operatori pentru tipurileprimitive% ;n plus, a" de limbajul C, C88 oer" posibilitateaasocierii operatorilor e$isteni cu tipurile defnite de utilizator%Astel, prezint" interes e$tinderea operatorilor:•  'n aritmetic" comple$"•  'n algebra matricial"•  'n lucrul cu !iruri de caractere, etc

    9n operator poate f privit ca o uncie, 'n care termenii suntargumentele unciei:•  'n lipsa operatorului 8 e$presia a8b sar calcula apel*nd

    uncia aduna(a,b)&rocedeul const" 'n defnirea unei unc, =?>, =::>, =@:>, =sizeo>%-eguli pentru supra'nc"rcare:• +etul de operatori ai limbajul C88 nu poate f e$tins prin

    asocierea de semnifcaii noi unor caractere, care nu suntoperatori (de e$emplu nu putem defni operatorul ??>)%

    • &rin supra'nc"rcarea unui operator nu i se poate modifca

    aritatea (astel operatorul => este unar !i poate fsupraincarcat numai ca operator unar)% De asemeniasociativitatea !i precedena operatorului se menin%

    • 7a supra'nc"rcarea unui operator nu se pot specifcaargumente cu valori implicite%

    • 3peratorii supra'nc"rcai 'ntro clas" sunt mo!tenii 'n

    clasele derivate (e$cepie ace operatorul de atribuire4>)%