Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
De observat cã <strong>în</strong> ambele cazuri un obiect stivã va contine un obiect vector, pentru<br />
cã un obiect stivã contine datele clasei sale, date mostenite dela superclasã si care sunt<br />
adresa si dimensiunea vectorului (la fel ca si <strong>în</strong> cazul agregãrii).<br />
Relatia stabilitã prin derivare este o relatie staticã <strong>în</strong>tre clase ( nu mai poate fi<br />
modificatã la executie), dar relatia stabilitã prin agregare este o relatie dintre obiecte si<br />
poate fi o relatie dinamicã, dacã variabila continutã <strong>în</strong> clasa compusã este de un tip<br />
mai general (clasã abstractã sau interfatã). Variabila continutã (obiect sau pointer la<br />
obiect) poate primi la executie, prin atribuire, variabile de diferite subtipuri.<br />
Un alt exemplu de reutilizare a functionalitãtii unei clase prin compunere poate fi o<br />
clasã pentru dictionare implementate printr-un singur vector extensibil. Metodele clasei<br />
dictionar pot folosi metode ale clasei vector: adãugare la vector (cu extindere, la<br />
nevoie), afisare vector, cãutare <strong>în</strong> vector s.a.<br />
Cele mai importante metode de lucru cu un dictionar sunt:<br />
Object * put (Object* key, Object* value); // pune o pereche in dictionar<br />
Object* get (Object * key); // obtine valoarea asociata unei chei date<br />
Un dictionar este o colectie de perechi cheie-valoare, <strong>în</strong> care cheia si valoarea pot<br />
avea orice tip dar cheile trebuie sã fie distincte ( la comparatie cu metoda “equals”). O<br />
solutie posibilã foloseste o clasã auxiliarã “Pair” pentru o pereche de obiecte si un<br />
vector <strong>în</strong> care se introduc pointeri la obiecte “Pair”.<br />
Exemplul urmãtor este o transcriere <strong>în</strong> C++ a unei situatii uzuale din Java, când se<br />
defineste o colectie ordonatã de obiecte generice comparabile. Ordonarea foloseste<br />
operatia de comparare, dar aceasta depinde de tipul obiectelor din colectie: altfel se<br />
comparã date calendaristice si altfel se comparã siruri de caractere sau numere. Este<br />
deci necesar ca la crearea unui obiect vector ordonat sã se transmitã si obiectul<br />
comparator specific tipului de obiecte introduse <strong>în</strong> vector. Clasa pentru vectori<br />
ordonati contine o variabilã pointer la tipul abstract “Comparator”, initializatã de<br />
constructor cu obiectul concret comparator (dintr-o subclasã a clasei “Comparator”).<br />
Obiectul concret comparator folosit de obiectul vector este stabilit la executie, iar<br />
relatia dintre aceste obiecte este o relatie dinamicã.<br />
// clasa ptr vectori ordonati de obiecte oarecare<br />
class SortedArray: public Array {<br />
private:<br />
Comparator* comp; // comparator de obiecte memorate<br />
void sort();<br />
public:<br />
SortedArray (int size, Comparator* cmp): Array(size) { comp=cmp;}<br />
void add (Object * p) {<br />
Array::add(p);<br />
sort();<br />
}<br />
};