Clase abstracte
Clase abstracte sunt clase
care nu pot fi instantiate.
Declarate unei clase abstracte se face cu modificatorul abstract.
Clasele abstracte pot contine si metode abstracte si
ne-abstracte. Metodele abstracte sunt folosite doar pentru a specifica faptul
ca orice subclasa concreta a respectivei clase abstracte va trebui sa
implementeze o astfel de metoda. Aceste metode contin
doar declaratia, fara
implementare.
abstract class GraphicObject {
int x, y;
. . .
void moveTo(int newX, int newY) { //metoda normala
. . .
}
abstract void draw(); //metoda abstracta
}
Implementarea
claselor pentru obiecte grafice ar putea fi următoarea:
class Circle extends GraphicObject {
void draw() {
. . . //obligatoriu implementarea
}
}
class Rectangle extends GraphicObject {
void draw() {
. . . //obligatoriu implementarea
}
}
Clasa abstracta poate sa nu aiba nici o metoda abstracta.
O metoda abstracta nu poate aparea decât într-o clasa abstracta.
Orice clasa care are o metoda abstracta trebuie declarata ca fiind abstracta.
Interfeţe
Interfetele duc conceptul de clasa abstracta cu un pas înainte
prin eliminarea oricarei implementari
a metodelor, punând în practica unul din conceptele POO de separare a modelului
unui obiect (interfata) de implementarea sa. Asadar, o interfata poate fi
privita ca un protocol de comunicare între obiecte.
O interfata Java defineste
un set de metode dar nu specifica nici o implementare pentru ele. O clasa care implementeaza o interfata trebuie
obligatoriu sa specifice implementari pentru toate
metodele interfetei, supunându-se asadar
unui anumit comportament.
Definirea unei interfete se face prin
intermediul cuvântului cheie interface.
Se face prin intermediul cuvântului cheie implements.
Variabilele unei interfete sunt implicit publice chiar daca nu sunt
declarate cu modificatorul public.
Variabilele unei interfete sunt implicit constante chiar daca nu sunt
declarate cu modificatorii static si final.
Metodele unei interfete sunt implicit publice chiar daca nu sunt
declarate cu modificatorul public.
EXEMPLU:
interface Instrument {
//defineste o metoda fara implementare
void play();
}
class Pian implements Instrument {
//clasa care implementeaza interfata
//trebuie obligatoriu sa implementeze metoda play
public void play() {
System.out.println("Pian.play()");
}
}
class Vioara implements Instrument {
//clasa care implementeaza interfata
//trebuie obligatoriu sa implementeze metoda play
public void play() {
System.out.println("Vioara.play()");
}
}
public class Muzica { //clasa principala
static void play(Instrument i) {
//metoda statica care porneste un instrument generic
//ce implementeaza interfata Instrument
i.play();
}
static void playAll(Instrument[] e) {
for(int i = 0; i < e.length; i++)
play(e[i]);
}
public static void main(String[] args) {
Instrument[] orchestra = new Instrument[2];
int i = 0;
orchestra[i++] = new Pian();
orchestra[i++] = new Vioara();
playAll(orchestra);
}
}
O clasa poate implementa oricâte interfete.
O clasa care implementeaza o interfata trebuie obligatoriu sa specifice cod pentru toate
metodele interfetei. Din acest motiv, odata creata si folosita la implementarea unor clase, o interfata nu mai trebuie modificata , în sensul ca adaugarea unor metode noi sau schimbarea signaturii
metodelor existente va duce la erori în compilarea claselor care o implementeaza.
Modificarea unei interfete implica modificarea
tuturor claselor care implementeaza acea interfata.
Implementarea unei interfete poate sa fie si o
clasa abstracta.
EXERCITIU: Modificaţi aplicaţia din subcaiptlul
„Polimorfism” transformând clasa Bird într-o
clasă abstractă.
EXERCITIU: Modificaţi aplicaţia din subcaiptlul
„Polimorfism” transformând clasa Bird într-o
interfaţă.