Clase abstracte şi interfeţe

 

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ţă.