Sunteți pe pagina 1din 31

Programare orientata-

obiect (POO)
utilizand C++

Dorel Lucanu
Gheorghe Grigoras
Introducere in POO (II)
• proiectul Agenda
• prezentare
• dezvoltarea aplicatiei utilizand MVC
• elemente interfata utilizator in mod text
• display box
• edit box
• meniu
• principii POO (continuare)
• mostenire
• polimorfism

D. Lucanu POO – Proiectarea de clase


Agenda
 Domeniul problemei
O agendă telefonică este o colecţie de contacte
Un contact este format dintr-un numar telefonic si
informaţii asociate (nume, prenume, adresa …)
 Cerinte program:
• adăugarea unui nou contact în agendă;
• editarea unui contact existent în agendă;
• ştergerea unui contact din agendă;
• afişarea tuturor informaţiilor existente în agendă
despre un contact;
• crearea unei noi agende;
• salvarea unei agende într-un fişier;
• încărcarea unei agende dintr-un fişier;
• închiderea unei agende;
D. Lucanu POO – Proiectarea de clase
Agenda cu MVC - v1
 vom considera un model simplificat al agendei
• un singur contact
• doar doua functionalitati
• vizualizare informatii generale + meniu actiuni
agenda
• vizualizare + meniu actiuni contact (doar
modificare)
 pentru fiecare functionalitate o instanta MVC

D. Lucanu POO – Proiectarea de clase


MVC not quite
an UML
Model diagram
•incapsuleaza starea aplicatiei
interog. stare
•raspunde la interogari despre stare

notif. sch.
•expune functionalitatea modelului

schimbare stare
•notifica schimbarea starii

View
•vizualizeaza modelul
•cere actualizari de la model
•trimite evenimentele utilizator la
controller
•permite controllerului sa schimbe Controller
modul de vizualizare •defineste comportarea aplicatiei
actiuni utilizator •mapeaza actiunile utilizator pe
actulizare model
•selecteaza vizualizarea
raspunsului
selectie vizualizare
•unul pentru fiecare functionalitate
D. Lucanu POO – Proiectarea de clase
MVC – functionalitate agenda not quite
an UML
model diagram

*** Agenda view ***


Proprietar: Ionescu

Menu:
1. Afiseaza
0. Exit
Option:

view

controller

D. Lucanu POO – Proiectarea de clase


MVC – functionalitate contact not quite
an UML
model diagram

*** Contact view ***


Contact: no contact aceasta actiune
Menu: poate modelata
1. Modifica cu MVC
0. Exit
Option:

view

controller

D. Lucanu POO – Proiectarea de clase


D. Lucanu POO – Proiectarea de clase
Analiza solutiei
 solutia descrisa are cateva defecte
• cod care se repeta (getUserAction)
• functii cu actiuni similare cu sectiuni care difera putin
• o slaba separare a functionalitatilor date de interfata
grafica
 toate acestea pot fi eliminate daca facem o clasificare a
elementelor de interfata
• display box
• edit box
• menu
•…

D. Lucanu POO – Proiectarea de clase


Display box
 exemplu eticheta valoare

Proprietar: Ionescu

• afiseaza o eticheta si o valoare (de tip sir)


• valoarea poate fi schimbata

D. Lucanu POO – Proiectarea de clase


Display box & MVC
model

dbOwner.setValue(model.getOwner)

view not quite


an UML
diagram

D. Lucanu POO – Proiectarea de clase


Editbox
 exemplu eticheta valoare introdusa de utilizator

Nume: _ _ _ _

• afiseaza o eticheta si preia o valoare (de tip sir)

D. Lucanu POO – Proiectarea de clase


Edit box & MVC not quite
an UML
model diagram

editBox.setLabel(string("Nume"));
model->setName(editBox.getValue());
editBox.setLabel(string("Nr telefon"));

setName()
view model->setPhoneNo(editBox.getValue());

getValue()

setLabel() controller

D. Lucanu POO – Proiectarea de clase


Menu
 afiseaza o lista de optiuni si preia valoarea optiunii
introduse de utilizator
 exemplu

Menu:
1. Afiseaza
0. Exit
Option:

D. Lucanu POO – Proiectarea de clase


Menu & MVC not quite
an UML
model diagram

view

display()
menu.addOption("1. Afiseaza");
menu.addOption("0. Exit");

case 1:
model->display();
getOption()

display() controller

D. Lucanu POO – Proiectarea de clase


D. Lucanu POO – Proiectarea de clase
Generalizare – specializare
 un contact poate fi
• o cunostinta
• un prieten
• un coleg
•…
 apare asadar necesitatea clasificarii contactelor
• orice contact are un nume, numar telefon si o operatie
de serializare toString
• o cunostinta are in plus o ocupatie,
• iar un prieten o zi de nastere
• iar un coleg o functie in cadrul institutiei/companiei
 rezulta o ierarhie a claselor ce descriu contactele,
cunostintele, prietenii, colegii …

D. Lucanu POO – Proiectarea de clase


Ierarhia Contact

relatie de
mostenire

 Contact este o generalizare (abstractizare) pentru


Acquiantance, Colleague, Friend …
 Acquiantance, Colleague, Friend … sunt specializari
(particularizari) ale clasei Contact
D. Lucanu POO – Proiectarea de clase
Mostenire
 mostenirea = mecanismul prin care elementele specifice
(specializate) încorporează structura şi comportarea
elementelor generale (reutilizare).
 principiul substituirii (B. Liskov, 1987): obiectele clasei
specializate (copil) pot fi utilizate oriunde apar obiecte ale
clasei generale (părinte) fara a altera proprietatile dorite
(dar nu şi reciproc);
 mostenirea este sinonima cu relatia de subtip
Let q(x) be a property provable about objects x of type T.
Then q(y) should be true for objects y of type S where
S is a subtype of T.
 relatia de mostenire este tranzitiva

D. Lucanu POO – Proiectarea de clase


Mostenirea in C++ 1/2
 se realizeaza prin derivare publica
class Contact
{ ...
public:
string toString()
protected:
string name;
protected: un nou limitator de
acces; elementele
string phoneNo;
protejate sunt
}; vizibile si in clasele
derivate

D. Lucanu POO – Proiectarea de clase


Mostenirea in C++ 2/2 relatia de
derivare publica

class Acquiantance : public Contact


{
suprascrierea metodei
... toString
public:
operatia din
string toString() { clasa de baza
return Contact::toString() +
string("Occupation: ") +
occupation + string("\n");
}
protected: declaratie inline a
metodei toString
string occupation;
};

D. Lucanu POO – Proiectarea de clase


Acquiantance myAcq("Ionescu", "1212121", "afacerist");
cout << myAcq.toString();
Friend myFriend("Popescu", "7676767", "12-12-1999");
cout << myFriend.toString();

D. Lucanu POO – Proiectarea de clase


Un client al ierarhiei Contact
 un “view” simplu care afiseaza continutul unui contact

void displayContact()
{
cout << contact->toString();
}

D. Lucanu POO – Proiectarea de clase


View view(&myAcq);
view.displayContact();
view.setContact(&myFriend);
view.displayContact();

ups! avem o problema

D. Lucanu POO – Proiectarea de clase


Sursa problemei

class View
{
public:
void displayContact()
{
cout << contact->toString();
}
private:
Contact *contact; legarea numelui la definitia sa
se face la momentul compilarii:
};
toString ⤳ Contact::toString { ... }

D. Lucanu POO – Proiectarea de clase


Solutia: legarea dinamica
 cunoscuta si sub numele de legare tarzie (late binding)
 legarea numelui (aici de metoda) este legat de
semnificatia/definitia sa (aici codul) la momentul executiei
 in C++ se realizeaza prin intermediul metodelor virtuale
class Contact
{ ...
public:
virtual string toString()
{
...
}
este suficient sa declaram virtuala numai metoda
}; din clasa de baza; toate suprascrierile din clasele
derivate vor fi considerate automat virtuale

D. Lucanu POO – Proiectarea de clase


View view(&myAcq);
view.displayContact();
view.setContact(&myFriend);
view.displayContact();

Magic!

D. Lucanu POO – Proiectarea de clase


Mecanismul metodelor virtuale
 Tabela functiilor virtuale (VFT)

myCntct Contact Contact::toString()


{
...
}

Acquiantance::
myAcq Acquiantance toString()
{
...
}

myFriend Friend Friend::toString()


{
...
}

D. Lucanu POO – Proiectarea de clase


Tbela functiilor virtuale (VFT)

class Contact{
. . .
void toString();
};

demo cout << sizeof(Contact) 64

class Contact{
. . .
virtual void toString();
};

demo cout << sizeof(Contact) 68


Principiul substituirii - contraexemplu

Dreptunghi

Patrat

 clasa Patrat are invariantul lungimea =


latimea
 o operatie maresteLungimea() a clasei
Dreptunghi nu pstreaza acest invariant
 deci un patrat nu poate fi utilizat in locul unui
dreptunghi totdeauna

D. Lucanu POO – Principii 30


Atentie la clasificare

Pasare

Pasare
zboara()

Pinguin PasareZburatoare PasareNezburatoare


zboara()

Pinguini care
zboara? Pinguin

D. Lucanu POO – Principii 31

S-ar putea să vă placă și