Sunteți pe pagina 1din 28

1

Prezentare 5:
Clase abstracte;
Interfete;

PROGRAMARE ORIENTATA
OBIECT
2020
O ierarhie de forme

Forma contine coordonatele in plan ale Forma


coltului stanga sus al dreptunghiului de x
incadrare. Subclasele declara noi campuri si y
metoda arie.

Dreptunghi Triunghi Cerc


latime baza
lungime inaltime raza
arie() arie() arie()

26.10.2020 POO 2
Ce este o Forma?
Forma
Un obiect de tip Forma nu este chiar o
x
forma.
y
 Nu vrem sa permitem crearea obiectelor
de tip Forma!

Facem clasa abstracta! Triunghi Cerc


baza
public abstract class Forma { inaltime raza
… arie() arie()
} Regula sintactica: daca clasa
C este abstracta, expresia
new C(…) nu poate fi utilizata!
26.10.2020 POO 3
Calculul sumei tuturor ariilor – in Forma

/** Intoarce suma ariilor formelor din f */


public static double sumaArie(Forma[] f) {
double suma= 0;
for (int k= 0; k < f.length; k++) a0
suma= suma + f[k].arie();
return suma; Forma
x 6
}
y 9
Functioneaza?
Regula de referentiere la compilare → nu! sumaArie(Forma[])
Solutii?
1. Down Cast pentru a putea apela? Cerc
2. Facem arie o metoda in clasa Forma? arie()
26.10.2020 POO 4
Solutia 1: down cast

double suma= 0;
for (int k= 0; k < f.length; k++) {
if (f[k] instanceof Cerc)
suma= suma + ((Cerc) f[k]).arie();
else if (f[k] instanceof Dreptunghi)
suma= suma + ((Dreptunghi) f[k]).arie();
}
return suma;

� sau 👎👎 1. Codul este “urat”


? 2. Codul nu permite dezvoltari ulterioare

26.10.2020 POO 5
Solutia 2: definim metoda arie in Forma
Adaugam metoda arie clasei Forma:

public double arie() { Problema: o subclasa


return 0; poate uita sa suprascrie
} arie().

Sau asa?
Problema: in continuare o
public double arie() { subclasa poate uita sa
throw new RuntimeException( suprascrie arie().
“arie nu este suprascrisa”);
}
26.10.2020 POO 6
Solutia 2++: arie – metoda abstracta

In clasa abstracta Forma, definim metoda abstracta arie:

public abstract class Forma {



/** Intoarce aria acestei forme*/
public abstract double arie() ;

}
Sintaxa:
Daca o metoda este declarata abstract, utilizam ; in locul
corpului metodei.
26.10.2020 POO 7
Observatii - abstract

1. Pentru a impiedica crearea unei


instante a unei clase C, definim C Sintaxa: programul nu poate
fi compilat daca C este
abstracta:
abstracta si programul contine
o expresie new C(…)
public abstract C { …}

2. Intr-o clasa abstracta, pentru a Sintaxa: programul nu poate


impune ca fiecare subclasa sa fi compilat daca o subclasa a
suprascrie metoda m(…), declaram unei clase abstracte nu
suprascrie o metoda
m abstracta:
abstracta.
public abstract void m(…) ;
26.10.2020 POO 8
O clasa abstracta – Tip de Date Abstract

Tip: multime de valori impreuna cu operatii asupra lor

Definim tipul Stack (stiva de intregi). Operatiile sunt:


isEmpty() --intoarce true daca stiva este vida
push(k) --pune intregul k pe stiva
pop() --scoate elementul din varful stivei
public abstract class Stack {
public abstract boolean isEmpty();
public abstract void push(int k);
public abstract int pop();
}

26.10.2020 POO 9
Exemplu: subclasa public abstract class Stack {
ArrayStack public abstract boolean isEmpty();
public abstract void push(int k);
al clasei Stack: public abstract int pop();
}
public class ArrayStack extends Stack {
private int n; // elementele stivei sunt in intervalul
private int[] e; // e[0..n-1]. e[0] este baza
/** Constructor: o stiva vida de dimensiune d. */
public ArrayStack(int d) {e= new int[d];}
public boolean isEmpty() {return n == 0;}
public void push(int v) { e[n]= v; n++;}
public int pop() {n--; return e[n]; }
}
26.10.2020 POO 10
Exemplu: subclasa public abstract class Stack {
ArrayStack al public abstract boolean isEmpty();
public abstract void push(int k);
clasei Stack: public abstract int pop();
}
public class LinkedListStack extends Stack{
private int n; // numarul elementelor din stiva
private Node first; // nodul din varful stivei
/** Constructor: stiva vida*/
public LinkedListStack() {}
public boolean isEmpty() { … }
public void push(int v) { … }
public int pop() { … }
}
26.10.2020 POO 11
Flexibilitate! public abstract class Stack { … }
public class ArrayStack extends Stack { … }

public class LinkedListStack extends Stack { … }

/** O clasa care utilizeaza o stiva */


public class C {
Stack st= new ArrayStack(20);

public void m() { Implementata
printr-un vector de
Stocheaza …
st.push(5); max 20 valori
pointerul

intr-o } Utilizeaza doar
variabila de} metodele clasei
tip Stack! Stack
26.10.2020 POO 12
Flexibilitate! public abstract class Stack { … }
public class ArrayStack extends Stack { … }

public class LinkedListStack extends Stack { … }

/** O clasa care utilizeaza o stiva*/


public class C { LinkedListStack();
Stack st= new ArrayStack(20);

public void m() {

st.push(5); Vream sa utilizam o

}
lista in locul unui
} vector? Schimbam
doar initializarea!

26.10.2020 POO 13
Interfete

O interfata este similara unei clase abstracte in care toate


elementele sunt metode public abstract. Difera sintaxa.

O interfata poate avea si alte componente. Pentru inceput


consideram ca are doar metode public abstract.

26.10.2020 POO 14
Interfete
O interfata este similara unei clase abstracte in care toate
elementele sunt metode public abstract. Difera sintaxa.

public abstract class Stack { O clasa abstracta


public abstract boolean isEmpty(); care contine doar
public abstract void push(int k);
public abstract int pop();
metode abstracte
}

public interface Stack { Declaratia


public abstract boolean isEmpty();
interfetei
public abstract void push(int k);
public abstract int pop();
}

26.10.2020 POO 15
Interfete
public abstract class Stack { public interface Stack {
public abstract boolean isEmpty(); boolean isEmpty();
public abstract void push(int k); void push(int k);
public abstract int pop(); int pop();
} }

Metodele trebuie sa fie


public si abstract; putem sa
O clasa este extinsa: nu scriem modificatorii.
class StackArray extends Stack {

} O interfata este implementata:
class StackArray implements Stack {

}
26.10.2020 POO 16
Utilizarea interfetelor
Fie urmatoarea ierarhie:

class Animal { … } Object


class Mamifer extends Animal { ... }
class Pasare extends Animal { … }
class Lemur extends Mamifer {. … }
class Pisica extends Mamifer { … } Animal
class Pescarus extends Pasare { … }

Mamifer Pasare

Lemur Pisica Pescarus


26.10.2020 POO 17
Utilizarea interfetelor

Lemurii si pescarusii pot zbura. Alte animale nu pot.

public void zboara(String z) { Object


System.out.println(z);
}
Animal
Trebuie sa putem specifica ca
metoda zboara este in
clasele Lemur si Pescarus. Mamifer Pasare

Lemur Pisica Pescarus


26.10.2020 POO 18
Utilizarea interfetelor
public interface Zburator {
void zboara(String z); Object
}

public class Lemur extends Mamifer


implements Zburator { Animal

public void zboara(String z) {
System.out.println(z); Zburator Mamifer Pasare
}
}

(similar pentru Pescarus) Lemur Pisica Pescarus


26.10.2020 POO 19
Utilizarea interfetelor
public interface Zburator {void zboara(String z); }

public class Lemur extends Mamifer implements Zburator {…


public void zboara(String z) { System.out.println(z); }
}
Reprezentarea obisnuita O alta reprezentare Adauga
Object interfata
Lemur@1
Animal Animal

Mamifer Zburator
Mamifer

Lemur Lemur
26.10.2020 POO 20
Cum arata un obiect de tip Lemur
l, ob, a, m, si z toate
Lemur l= new Lemur();
indica catre acelasi
Object ob= l;
obiect.
Animal a= (Animal) ob;
Mamifer m= l; Obiectul poate fi
Zburator z= l; convertit la orice
Object “partitie” din el: l, ob, a,
m, si z.

Animal Up-cast: implicit;


inserat de Java
Mamifer Zburator
Down-cast: explicit
Lemur
26.10.2020 POO 21
Utilizarea interfetelor

Consideram un vector de Forme: vrem sa le ordonam in ordinea crescatoare a ariilor


Consideram un vector de intregi (int): vrem sa-i ordonam in ordine crescatoare
Consideram un vector de ferestre pe ecran: vrem sa le ordonam dupa adancime

Nu vrem sa scriem diferite metode de sortare!

Metoda de sortare este aceeasi in fiecare caz. Difera modul in care


elementele vectorului sunt comparate.

Scriem O SINGURA metoda de sortare, care primeste functia


utilizata pentru a compara elementele. Utilizam o interfata.

26.10.2020 POO 22
Interfata Comparable
Pachetul java.lang contine interfata

public interface Comparable { //ignoram parametrizarea de tip


/** = un numar negativ daca obiectul curent < c,
= 0 daca obiectul curent = c,
= un numar pozitiv daca obiectul curent > c.
este aruncata ClassCastException daca c nu poate fi convertit la
clasa obiectului curent */
int compareTo(Object c);
}

26.10.2020 POO 23
Interfata Comparable
Implementam interfata Comparable in clasa Forma

public abstract class Forma implements Comparable {



/** Intoarce aria acestei forme */
public abstract double arie() ; Daca c nu poate fi
/** met slide anterior*/ convertit la Forma,
public int compareTo(Object c) { este aruncata o
Forma f= (Forma) c; exceptie
double dif= arie() – f.arie(); ClassCastException
return dif == 0 ? 0 : (dif < 0 ? -1 : 1);
}

26.10.2020 POO 24
Utilizarea interfetelor

/** Sortam vectorul a. Elementele lui a trebuie sa implementeze


interfata Comparable. Metoda compareTo este utilizata pentru a
determina ordinea elementelor lui a. */
Arrays.sort(Object[] a)

Forma implementeaza Comparable, putem scrie:

// Stocheaza un vector de valori in forme


Forma[] forme= ...;
...
Arrays.sort(forme);

26.10.2020 POO 25
Utilizarea interfetelor
public abstract class Forma implements Comparable { … }
public class Cerc extends Forma { … }
public class Dreptunghi extends Forma { … }
Atunci cand procedura sort compara elementele vectorului
Forma, fiecare element este o Forma. Procedura “vede” doar
din perspectiva Comparable!
Object Object

Comparable Comparable

Forma Forma

Cerc Dreptunghi
26.10.2020 POO 26
Clase abstracte vs Interfete

 Clasele abstracte  Interfata defineste ceea se


reprezinta “ceva” poate face. Defineste un
 Partajeaza cod comun TDA
intre subclase  Un contract
 O clasa poate extinde o  O clasa poate implementa
singura clasa oricate interfete

Similaritati:
 Nu pot fi instantiate
 Metodele abstracte trebuie implementate

26.10.2020 POO 27
Interfete++ (>Java 8)

Interfetele permit definirea:


 Campuri – implicit public, static, final (> Java 0)
 Metode statice – nu pot fi suprascrise in clasa care
implementeaza interfata
 Metode default

Exemplu- in interfata List a fost adaugata metoda sort:


default void sort (Comparator<? Super E> c) {
Colections.sort(this, c);
}

26.10.2020 POO 28

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