Sunteți pe pagina 1din 17

Ierarhii de clase.

Relații între
clase.Agregare.
profesor Dobrovolischii Olga
Programarea Orientată pe Obiecte
Programarea Orientată pe Obiecte simplifică dezvoltarea și întreținerea software-
ului oferind cîteva concepte:

obiect
clasă
moștenire
polimorfism
abstractizare
încapsulare
Tipurile de moștenire în Java
Pornind de la clasa de bază, în Java există 3 tipuri de moștenire:
simplă
pe mai multe niveluri
ierarhică
Ierarhii de clase
Definiție: O ierarhie este o clasificare sau o ordonare a abstracțiunilor.
Ierarhia de clase este o ierarhie de tip generalizare/specializare. de clase
este generată de relațiile de tip is a(un fel de ) dintre clasele de obiecte.
Această relație se numește relația de moștenire.
class Animal{
Animal
void manîncă(){System.out.println("mănîncă...");}
}
class Cîine extends Animal{ is a
void latră(){System.out.println("latră...");}
}
class Test{
Cîine
public static void main(String args[]){
DogCîine d=new Cîine();
d.latra();
d.manîncă();
}}
Asocierea, Compoziția ,Agregarea

Asocierea se referă la relația dintre mai multe obiecte. Se referă la modul în care
obiectele sunt legate între ele și la modul în care acestea folosesc funcționalitatea
celuilalt. Compoziția și agregarea sunt două tipuri de asociere.

Agregarea și compunerea se referă la prezența unei referințe pentru un obiect într-


o altă clasă. Acea clasă practic va refolosi codul din clasa corespunzatoare
obiectului.
Agregarea

Agregarea (aggregation) - obiectul-container poate exista și în absența obiectelor agregate


de aceea este considerată o asociere slabă (weak association).
Exemplu:
Cerc Operatii

Operatii op patrat(int n)
double pi

aria(int radius)
Agregarea
Exemplu:
class Addres { public class Ang{
String oras, tara; int id;
String nume;
public Addres(String oras, String tara) { Addres adresa;
this.oras = oras;
this.tara = tara; public Ang(int id, String nume, Addres adresa) {
} this.id = id;
this.nume = nume;
} this.adresa = adresa;
}

void display() {
System.out.println(id + " " + nume);
System.out.println(adresa.oras + " " + adresa.tara);
}

public static void main(String[] args) {


Addres adresa1 = new Addres("Chisinau", "Moldova");
Addres adresa2 = new Addres("Cahul", "Moldova");

Ang e = new Ang(111, "Ion", adresa1);


Ang e2 = new Ang(112, "Maria", adresa2);

e.display();
e2.display();}}
Compunerea(Composition)

Compunerea (composition) - este o agregare puternică (strong), indicând că existența unui


obiect este dependentă de un alt obiect. La dispariția obiectelor conținute prin compunere,
existența obiectului container încetează.
Caracteristicile compunerii(composition):

Compoziția reprezintă o parte(part-of) a relației

Ambele entități sunt legate între ele în compoziție(într-un întreg). Dacă obiectul container
este distrus atunci obiectul compus nu poate exista fără obiectul părinte.

Compoziția dintre 2 entități se face atunci cînd un obiect conține un obiect compus, iar
obiectul compus nu poate exista fără o altă entitate.
class Facultate { class Universitate { class ExempluCompozitie {
public String nume; private final List<Facultate> facultati;
public String specialitate; public static void main(String[] args) {
Universitate(List<Facultate> facultati) Facultate c1 = new Facultate("Fizica si Matematica", "Matematica");
Facultate(String nume, { Facultate c2 = new Facultate("Informatica si Matematica",
String adresa) { this.facultatii = facultati; "Informatica");
this.nume = nume; } Facultate c3 = new Facultate("Fizica si Matematica", "Fizica");
this.adresa = public List<Facultate> facultate = new ArrayList<Facultate>();
adresa; List<Facultate>getListaFacultatilor() { facultate.add(c1);
} return facultati; facultate.add(c2);
} }} facultate.add(c3);
Universitate universitate = new Universitate(facultate);
List<Facultate> facultate=universitate.getListaFacultatilor();
for (Facultate fc : facultati) {
System.out.println("Nume : " + fc.nume + " si " + " Specialitate
: " + fc.specialitate);
}}}
Inițializarea sub-obiectelor în cadrul obiectelor compuse la realizarea
compoziției(agregării)

La momentul definirii obiectului- inițializarea se face înainte de apelarea constructorului.

În constructor
Inițializarea sub-obiectelor în cadrul obiectelor compuse la realizarea
compoziției(agregării)

3. chiar înainte de folosire (acest mecanism se numește inițializare leneșă (lazy


initialization))

De obicei acest mecanism se utilizează mai des atunci cînd se lucrează cu clasele
Singleton class(clase care controlează crearea obiectului.Înseamnă că clasa singleton ne
permite să creăm un singur obiect al clasei, la un moment dat. Este de obicei folosit pentru
a controla accesul la resurse, cum ar fi conexiunile la baze de date)
Agregare vs. moștenire
Când se folosește moștenirea și când agregarea?
Răspunsul la această întrebare depinde, în principal, de datele problemei analizate dar și de
concepția designerului, neexistând o rețetă general valabilă în acest sens. În general, agregarea
este folosită atunci când se dorește folosirea trăsăturilor unei clase în interiorul altei clase, dar nu și
interfața sa (prin moștenire, noua clasă ar expune și metodele clasei de bază). Putem distinge
două cazuri:
uneori se dorește implementarea funcționalității obiectului conținut în noua clasă și limitarea
acțiunilor utilizatorului doar la metodele din noua clasă (mai exact, se dorește să nu se permită
utilizatorului folosirea metodelor din vechea clasă). Pentru a obține acest efect se va agrega în
noua clasă un obiect de tipul clasei conținute și având specificatorul de acces private.
obiectul conținut (agregat) trebuie/se dorește a fi accesat direct. În acest caz vom folosi
specificatorul de acces public.
Moștenirea este un mecanism care permite crearea unor versiuni “specializate” ale unor
clase existente (de bază). Moștenirea este folosită în general atunci când se dorește
construirea unui tip de date care să reprezinte o implementare specifică (o specializare
oferită prin clasa derivată) a unui lucru mai general. Un exemplu simplu ar fi clasa Dacia
care moștenește clasa Car.
Diferența dintre moștenire și agregare este de fapt diferența dintre cele 2 tipuri de relații
majore prezente între obiectele unei aplicații :
is a - indică faptul că o clasă este derivată dintr-o clasă de bază (intuitiv, dacă avem o clasă
Animal și o clasă Cîine, atunci ar fi normal să avem Cîine derivat din Animal, cu alte cuvinte
Cîine is an(este un) Animal)
has a - indică faptul că o clasă-container are o clasă conținută în ea (intuitiv, dacă avem o
clasă Car și o clasă Motor atunci ar fi normal să avem Motor referit în cadrul Car, cu alte
cuvinte Car has a Motor)
Upcasting și Downcasting
Convertirea unei referințe la o clasă derivată într-una a unei clase de bază poartă
numele de upcasting. Upcasting-ul este facut automat și nu trebuie declarat explicit de
către programator.
Downcasting este operația inversă upcast-ului și este o conversie explicită de
tip în care se merge în jos pe ierarhia claselor (se convertește o clasă de bază într-
una derivată). Acest cast trebuie făcut explicit de către programator. Downcasting-
ul este posibil numai dacă obiectul declarat ca fiind de o clasă de bază este, de
fapt, instanță clasei derivate către care se face downcasting-ul.
Upcasting și Downcasting

Animal

Dog Cat
Exercițiu: Pentru schema de mai jos compuneți un algoritm care reflectă relațiile
dintre obiecte.