Documente Academic
Documente Profesional
Documente Cultură
Introducere
1.1
Clase abstracte
Claselele simple, clasele abstracte si interfetele reprezinta cele 3 structuri care stau la baza definitiei POO si
care isi propuna sa modeleze o aplicatie intr-un mod: structurat, flexibil si usor de refolosit. Cateva reguli
definesc diferentele intre cele 3 entitati si totodata evidentiaza cand ar trebui utilizate.
2.
3.
4.
5.
O clasa abstracta poate sa fie doar mostenita de o alta clasa, nu se permite mostenirea multipla in
JAVA in cadrul aceleasi clase
6.
Scopul principal al utilizari claselor abstracte este refolosirea si organizarea codului, dar si mapareaa
conexiunilor intre clase intr-o ordine naturala(e.x Cat extends Animal = > Cat IS-A Animal)
7.
Ex:
abstract class GraphicObject {
int x, y;
...
void moveTo(int newX, int newY) {
...
}
abstract void draw();
abstract void resize();
}
8.
Exemplul de la punctul 7 defineste o clasa abstracta care isi propune sa defineasca un obiect grafic,
clasa care o sa fie mostenita de toate clasele care apartin familiei de obiecte grafice exemplu: un cub
are o pozitie in harta de obiecte (x,y), trebuie sa implementeze metodele abstracte draw() si resize(),
deoarece sunt meode 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 un set de clase printr-o interfata
comuna reutilizam o serie metode si membrii 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.
!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).
Interfete
Spre deosebire de clasele abstracte interfetele au un rol de compunere a obiectelor din subobiecte. Spre
deosebire de clasele abstracte care reprezinta o absctratizare 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. O clasa abstracta in acest
model s-ar ocupa de definirea conceptului de roti adaugand si implementare default unde considera ca ar fi
un grad foarte mare de reutilizare a metodei. Mergand in jos in lantul de mostenire o clasa ar fi chiar
implemenatrea specifica a unui anumit model de masina care sa respecta atat relatille IS-A si HAS-A.
2.
3.
4.
5.
6.
7.
Scopul principal al utilizari claselor interfetelor este organizarea si definirea modelului pe care
dorim sa il implementam (e.x Car implements CarInterface = > CarInterface HAS Car)
8.
Ex:
9.
Exemplul de la punctul 8 defineste un instrument si totodata defineste o conexiune intre clasele care
contin date despre tipul si utilizarea instrumentului. Interfetele duc conceptul abstract un pas mai
departe. Se poate considera ca o interfata este o clasa abstracta pura: permite programatorului sa
stabileasca o "forma" pentru o clasa: numele metodelor, lista de argumente, valori intoarse, dar fara
nicio implementare. O interfata poate contine campuri dar acestea sunt in mod implicit static si final.
10. Interfata este folosita pentru a descrie un protocol intre clase: o clasa care implementeaza o interfata
va implementa metodele definite in interfata. Astfel orice cod care foloseste o anumita interfata stie
ce metode pot fi apelate pentru acea interfata.
Exercitii
1.
Pornind de la schema de mai jos definiti si implementati modelul de clase. De asemenea ganditi-va
si adaugati un layer de interfata, implementand interfata si motivand alegerea.
2.
Implementati interfata Task in cele 3 moduri de mai jos. La crearea claselor in Eclipse, utilizati
interfata vizuala pentru precizarea interfetelor ce se doresc implementate (metodele corespunzatoare
vor fi adaugate automat).
a.
b.
Un task care genereaza un numar aleator si afiseaza un mesaj cu numarul generat la output.
Generarea se face in constructor
c.
Un task care incrementeaza un contor global si afiseaza valoarea contorului dupa fiecare
incremenetare.
Interfata Container specifica interfata comuna pentru colectii de obiecte Task, in care se pot adauga
si din care se pot elimina elemente. Creati doua tipuri de containere care implementeaza aceasta
clasa:
a.
b.
5.
b.
c.
d.
Dupa executia fiecarui task va avea loc o actiune - actiune abstracta, specifica claselor care
mostenesc AbstractTaskRunner (vezi ex. urmator). Metoda abstracta care specifica aceasta
actiune trebuie sa fie vizibila doar pentru clasele din lantul de mostenire ce porneste din
AbstractTaskRunner.
PrintTaskRunner - care afiseaza un mesaj dupa executia unui task in care se specifica ora
la care s-a executat task-ul (vezi clasa Date)
b.
CountTaskRunner - incrementeaza un contor local care tine minte cate task-uri s-au
executat.
c.
d.
Extindeti PrintTaskRunner astfel incat sa se introduca o intarziere intre executiile taskurilor. Intarzierea este specificata in constructor. Pentru introducerea unei intarzieri in
executia programului puteti utiliza secventa de mai jos:
try {
Thread.sleep(1000); // milisecunde
} catch (InterruptedException e) {
e.printStackTrace();
}
Referine
http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html