Sunteți pe pagina 1din 8

Programare Orientată pe Obiecte

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:

1. Antet: modificator de access: public/private abstract class


2. Componenta: pot contine atat metode abstracte cat si metode non-abstracte
3. Relatia de mostenire: IS-A
4. 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 aceleiasi clase
6. Scopul principal al utilizarii claselor abstracte este refolosirea si organizarea codului, dar si
maparea conexiunilor intre clase intr-o ordine naturala(ex. Cat extends Animal = > Cat IS-A
Animal)
7. Exemplu:

abstract class GraphicObject {


int x, y;
...
void moveTo(int newX, int newY) {
...
}
1
Programare Orientată pe Obiecte

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 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:

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 definitie 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

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.

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

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

Interfetele respecta urmatoarele reguli:


1. Antet: interface ClassName
2. Componenta: pot contine doar antete de metode si constante
3. Relatia respectata: HAS-A
4. Asemanator cu clasele abstracte, nu se pot instantia sau implementa, doar mosteni
a. interfata poate sa extinda doar alta interfata si nimic altceva
b. interfata nu poate sa implementeze nici un tip de obiect
5. Scopul principal al utilizarii interfetelor este organizarea si definirea modelului pe care
dorim sa il implementam (e.x Car implements CarInterface = > CarInterface HAS Car)
6. Ex:

7. Exemplul de la punctul anterior 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.
8. 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.
9. 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

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

// Cannot have method definitions:


void play(); // Automatically public
String what();
void adjust();
}

class Suflat implements Instrument {

public void play() {


System.out.println("Suflat.play()");
}

public String what() {


return "Suflat";
}

public void adjust() {}


}

class Trompeta extends Suflat {

public void play() {


5
Programare Orientată pe Obiecte

System.out.println("Trompeta.play()");
}

public void adjust() {


System.out.println("Trompeta.adjust()");
}
}

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:

- Variabila membru String color


- Variabila membru boolean filled
- Variabila membru dateCreated, de tipul java.util.Date
- Un constructor fara parametri ce seteaza color=”red”, filled=”false” si dateCreated cu data
curenta
- Un constructor cu parametri, corespunzatori campurilor color si filled
- Metoda getColor() ce returneaza culoarea obiectului geometric
- Metoda setColor(String color) ce seteaza culoarea obiectului geometric
- Metoda isFilled() ce returneaza valoarea variabilei filled
- Metoda setFilled(boolean filled) ce seteaza valoarea variabilei filled
- Metoda getDateCreated() ce returneaza data la care a fost creat obiectul
- Metodele abstracte double getArea() si double getPerimeter()
- Metoda abastracta void Display()

 Implementati clasele Circle si Rectangle ce mostenesc clasa abstracta GeometricObject si


definiti in cadrul lor metodele getArea() si getPerimeter() ce calculeaza aria si perimetrul
cercului, respectiv dreptunghiului. Aceste doua clase vor avea in plus campurile radius,
respectiv width si height. Suprascrieti si metoda void Display(), astfel incat sa afiseze:

”Rectangle displayed of dimensions: width and height”, unde width si height sunt latimea si
lungimea dreptunghiului - pentru un obiect din clasa Rectangle

Exemplu: ”Rectangle displayed of dimensions: 5.5 and 8.75”

”Circle displayed of radius: radius”, unde radius reprezinta raza cercului – pentru un obiect
din clasa Circle

Exemplu: ”Circle displayed of radius: 6.85”

Definiti urmatorii constructori, folosindu-va de constructorii clasei de baza (se apeleaza


super()).

public Rectangle (String color, boolean filled, double width, double height)

public Circle (String color, boolean filled, double radius)

 Implementati clasa Scene ce contine ca variabila membru un tablou de obiecte de tipul


GeometricObject. Asemanator clasei MyArrayList din laboratorul trecut, implementati
metode ce permit adaugarea si eliminarea de obiecte de tipul GeometricObject din tablou
(add si remove).

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.

Prin apeluri ale functiilor DisplayAll(), AreaAll() si PerimeterAll(), afisati informatiile


despre cele 4 obiecte, aria si perimetrul total.

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.

Functia Display() va afisa:

”Square displayed of side: side”, unde side reprezinta latura patratului

Exemplu: ”Square displayed of side: 2.25”

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