Documente Academic
Documente Profesional
Documente Cultură
Laborator 3
24.10.2016 – 28.10.2016
Clase Abstracte & Interfete
CUPRINS
1. Clase abstracte .............................................................................................................................. 1
2. Interfete ......................................................................................................................................... 3
3. Aplicatii ........................................................................................................................................ 7
1. Clase abstracte
Clasele simple, clasele abstracte si interfetele reprezinta cele 3 structuri care stau la baza definitiei
POO si care isi propun sa modeleze o aplicatie intr-un mod structurat, flexibil si usor de refolosit.
Cateva reguli definesc diferentele dintre cele 3 entitati si totodata evidentiaza cand ar trebui
utilizate.
Clasele abstracte respecta urmatoarele reguli:
8. Exemplul de la punctul 7 defineste o clasa abstracta care isi propune sa defineasca un obiect
grafic. Clasa o sa fie mostenita de toate clasele care apartin familiei de obiecte grafice. De
exemplu: un cub are o pozitie in harta de obiecte (x,y), trebuie sa implementeze metodele
abstracte draw() si resize() - deoarece sunt metode abstracte si poate sa foloseasca moveTo(...) cu
implementarea implicita din clasa parinte sau sa aleaga sa isi adauge propria implementare.
Uitandu-ne atent la exemplul de mai sus observam ca putem mapa foarte usor un obiect grafic si
totodata putem crea o legatura intre diferite obiect grafice. Practic, se respecta relatia matematica
de submultime inclusa in multime.
9. De obicei, o clasa abstracta este definita cand se doreste manipularea unui set de clase printr-
o interfata comuna. In acest caz, reutilizam o serie de metode si membri din aceasta clasa in
clasele derivate.
10. Metodele suprascrise in clasele derivate vor fi apelate folosind dynamic binding (late
binding). Acesta este un mecanism prin care compilatorul, in momentul in care nu poate
determina implementarea unei metode in avans, lasa la latitudinea JVM-ului (masinii virtuale)
alegerea implementarii potrivite, in functie de tipul real al obiectului. Acesta legare a
implementarii de numele metodei la momentul executiei sta la baza polimorfismului.
11. Crearea unui obiect al unei clase abstracte este o eroare, compilatorul Java semnaland eroare
in acest caz.
12. O metoda este abstracta (adica se declara doar interfata ei, nu si implementarea) in Java daca
se foloseste cuvantul cheie abstract:
2
Programare Orientată pe Obiecte
abstracte si tot asa. O clasa care poate fi instantiata (nu este abstracta) si care mosteneste o clasa
abstracta trebuie sa implementeze (defineasca) toate metodele abstracte pe lantul mostenirii (ale
tuturor claselor abstracte care ii sunt "parinti").
17. Doar o clasa abstracta A care mosteneste o alta clasa abstracta B poate sa nu implementeze
metodele – dar daca alege sa le implementeze, atunci orice alta clasa non-abstracta C o sa
beneficieze de ultima implementare.
!!! Este posibil sa declaram o clasa abstracta fara ca ea sa aiba metode abstracte. Acest lucru este
folositor cand declaram o clasa pentru care nu dorim instante (nu este corect conceptual sa avem
obiecte de tipul acelei clase, chiar daca definita ei este completa).
2. Interfete
Spre deosebire de clasele abstracte, interfetele au rol de compunere al obiectelor din sub-obiecte.
Spre deosebire de clasele abstracte, care reprezinta o abstractizare a unui anumit tip de obiect, o
interfata este un nivel mai sus si isi propune sa defineasca modele de concept. Astfel, daca ne
gandim la o masina, conceptele de baza, reutilizabile, continute intr-o interfata, ar putea fi: roti,
motor, volan, sasiu. Mergand in jos in lantul de mostenire, o clasa ar fi chiar implementarea
specifica a unui anumit model de masina care sa respecte atat relatille IS-A, cat si HAS-A.
3
Programare Orientată pe Obiecte
4
Programare Orientată pe Obiecte
nume ca si interfata. Daca o interfata nu este declarata public atunci specifcatorul ei de acces
este package-private.
10. Pentru a defini o clasa care este conforma cu o interfata anume folosim cuvantul cheie
implements. Aceasta relatie este asemanatoare cu mostenirea, cu diferenta ca nu se
mosteneste comportamentul, ci doar "interfata".
11. Dupa ce o interfata a fost implementata, acea implementare devine o clasa obisnuita care
poate fi extinsa prin mostenire.
12. O clasa (non abstracta) poate sa implementeze mai multe interfete
interface Instrument {
int i = 5; // static & final
System.out.println("Trompeta.play()");
}
Implicit, specificatorul de acces pentru membrii unei interfeţe este public. Atunci când
implementǎm o interfaţǎ trebuie sǎ specificǎm cǎ funcţiile sunt public chiar dacǎ în interfaţǎ ele nu
au fost specificate explicit astfel. Acest lucru este necesar deoarece specificatorul de acces implicit
în clase este package-private, care este mai restrictiv decât public.
Extinderea interfeţelor
Se pot adǎuga cu uşurinţǎ metode noi unei interfeţe prin extinderea ei într-o altǎ interfaţǎ:
Exemplu:
interface Monster {
void menace();
}
interface DangerousMonster extends Monster {
void destroy();
}
6
Programare Orientată pe Obiecte
3. Aplicatii
1. Implementati clasa abstracta GeometricObject, ce contine:
”Rectangle displayed of dimensions: width and height”, unde width si height sunt latimea si
lungimea dreptunghiului - pentru un obiect din clasa Rectangle
”Circle displayed of radius: radius”, unde radius reprezinta raza cercului – pentru un obiect
din clasa Circle
public Rectangle (String color, boolean filled, double width, double height)
Definiti metoda void DisplayAll() care afiseaza informatiile despre fiecare obiect din tablou
pe cate o linie pe ecran, prin apeluri ale functiei Display().
Definiti metoda double AreaAll() care calculeaza aria totala a obiectelor din tablou si
metoda double PerimeterAll() care calculeaza perimetrul total al obiectelor tabloului.
7
Programare Orientată pe Obiecte
In cadrul functiei main, creati un obiect din clasa Scene, populati-l cu 2 obiecte de tipul
Rectangle si cu 2 obiecte din clasa Circle – trebuie sa apelati functia add definita in clasa
Scene pentru a adauga obiectele. Toate obiectele vor avea culoarea neagra, campul filled de
valoare true si dimensiuni la alegere.
De asemenea, pentru fiecare obiect in parte afisati ora la care a fost creat – apelati metoda
getDateCreated() din clasa de baza.
2. Interfata Colorable contine metoda void HowToColor(), nedefinita. Scrieti definitia clasei
Square ce implementeaza interfata Colorable si extinde clasa GeometricObject. Aceasta
contine in plus variabila membru side, reprezentand latura patratului. Suprascrieti metoda
HowToColor() astfel incat sa afiseze mesajul ”Colored square”, getArea(), getPerimeter() si
Display(). In cadrul functiei main, creati un obiect de tipul Square si apelati-i metodele.