Documente Academic
Documente Profesional
Documente Cultură
Prezentare 5:
Clase abstracte;
Interfete;
PROGRAMARE ORIENTATA
OBIECT
2020
O ierarhie de forme
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!
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;
26.10.2020 POO 5
Solutia 2: definim metoda arie in Forma
Adaugam metoda arie clasei Forma:
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
}
Sintaxa:
Daca o metoda este declarata abstract, utilizam ; in locul
corpului metodei.
26.10.2020 POO 7
Observatii - abstract
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 { … }
26.10.2020 POO 13
Interfete
26.10.2020 POO 14
Interfete
O interfata este similara unei clase abstracte in care toate
elementele sunt metode public abstract. Difera sintaxa.
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();
} }
Mamifer Pasare
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.
26.10.2020 POO 22
Interfata Comparable
Pachetul java.lang contine interfata
26.10.2020 POO 23
Interfata Comparable
Implementam interfata Comparable in clasa Forma
26.10.2020 POO 24
Utilizarea interfetelor
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
Similaritati:
Nu pot fi instantiate
Metodele abstracte trebuie implementate
26.10.2020 POO 27
Interfete++ (>Java 8)
26.10.2020 POO 28