Sunteți pe pagina 1din 5

Programare Orientat pe Obiecte

Clase abstracte si interfete


1

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.

Clasele abstracte respecta urmatoarele reguli:


1.

Antet: modificator de access (e.x public, private, abstract) abstract class

2.

Componenta: pot contine atat metode abstracte cat si metode non-abstracte

3.

Relatia de mostenire: IS-A

4.

Asemanator cu interfetele nu se pot instantia sau implementa, doar mosteni(extends)

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.

Programare Orientat pe Obiecte


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), Java daca foloseste
cuvantul cheie abstract:
abstract void f();
13. O metoda abstracta este diferita de o metoda normala deoarece nu are implementare si contine in
definitite antetul abstract.
14. O clasa care contine metode abstracte este numita clasa abstracta. Daca o clasa are una sau mai
multe metode abstracte atunci ea trebuie sa contina in definite cuvantul abstract.
15. Deoarece o clasa abstracta este incompleta (exista metode care nu sunt definite), crearea unui obiect
de tipul clasei este impiedicata de compilator.
16. O clasa care mosteneste o clasa abstracta este ea insasi abstracta daca nu implementeaza toate
metodele abstracte ale clasei de baza. Putem defini clase abstracte care mostenesc alte clase
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 abstracta A care mosteneste o alta clasa abstracta B poate sa nu implementeze metodele
dar daca alege sa le implementeze atunci orice clasa alta class non abstract C o sa beneficieze de
ultima implementare.
abstract class Animal {
public abstract void makeASound();
public abstract void command();
}
abstract class Dog extends Animal {
public void makeASound(){ //1
System.out.println("Auuuuuuuuu");
}
}
class Rottweiler extends Dog{
public void makeASound(){}//2
public void command(){}
}

!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).

Programare Orientat pe Obiecte


1.2

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.

Interfetele respecta urmatoarele reguli:


1.

Antet: interface ClassName

2.

Componenta: pot contine doar antetele de metode si constante

3.

Relatia respectata: HAS-A

4.

Asemanator cu interfetele nu se pot instantia sau implementa, doar mosteni(extends)

5.

O interfata poate sa extinda doar alta interfata si nimic altceva

6.

O interfata nu poate sa implementeze nici un tip de obiect

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.

Programare Orientat pe Obiecte


11. Pentru a crea o interfata folosim cuvantul cheie interface in loc de class. La fel ca in cazul claselor,
interfata poate fi declarata public doar daca este definita intr-un fisier cu acelasi nume ca si interfata.
Daca o interfata nu este declarata public atunci specifcatorul ei de acces este package-private.
12. 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 comportament, ci
doar "interfata".
13. Dupa ce o interfata a fost implementata, acea implementare devine o clasa obisnuita care poate fi
extinsa prin mostenire.
14. O clasa (non abstracta) poate sa implementeze mai multe interfete

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.

Un task care sa afiseze un mesaj la output. Mesajul este specificat in constructor.

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.

Programare Orientat pe Obiecte


3.

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.

Stack - care implementeaza o strategie de tip LIFO

b.

Queue - care implementeaza o strategie de tip FIFO

Evitati codul similar in locuri diferite!


Hint: Puteti retine intern colectia de obiecte, utilizand clasa ArrayList din biblioteca Java, ce va fi
folosita asemanator clasei MyArrayList din Laboratorul 2. Iata un exemplu de initializare pentru
siruri:
ArrayList<String> list = new ArrayList<String>();
4.

5.

Creati clasa AbstractTaskRunner care executa Task-uri, ce va contine:


a.

Un constructor ce primeste ca parametru o strategie prin care se specifica in ce ordine se


vor executa task-urile (LIFO sau FIFO)

b.

O metoda addTask, care adauga un task in colectia de task-uri de executat

c.

O metoda executeAll, care executa toate task-urile din colectia de task-uri

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.

Extindeti clasa AbstractTaskRunner in 3 moduri


a.

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.

RedoTaskRunner - salveaza fiecare task executat intr-un container in ordinea inversa a


executiei si are o metoda prin care se permite reexecutarea task-urilor.

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

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