Vous êtes sur la page 1sur 23

Programmation Orientée Objet

Java 1

Chapitre 6 : Classes abstraites et interfaces

Classes: DSI 21

Mme Samia B.ABDELJELIL


Samia BA LEBIBE - DECEMEBRE 2020
2

Héritage et abstraction
Classes abstraites

Samia BA LEBIBE - DECEMEBRE 2020


Classes Abstraites
3 Exemple introductif
 un grand classique les formes géométriques
 on veut définir une application permettant de manipuler des formes
géométriques (triangles, rectangles, cercles…).
 chaque forme est définie par sa position dans le plan

 chaque forme peut être déplacée (modification de sa position), peut calculer


son périmètre, sa surface
largeur
v2
r
hauteur
x,y
x,y v1
x,y

Attributs : Attributs :
Attributs : double x,y; //1 des sommets
double x,y; //centre du cercle double x,y; //coin inférieur gauche double x1,y1; // v1
double r; // rayon double largeur, hauteur;
Méthodes : double x2,y2; // v2
Méthodes : Méthodes :
deplacer(double dx, double dy) deplacer(double dx, double dy)
double surface() deplacer(double dx, double dy)
double surface() double surface()
double périmètre()
double périmètre(); double périmètre();

Factoriser le code ?
Samia BA LEBIBE - DECEMEBRE 2020
Classes abstraites
4
p u b l i c class Forme {
protected double x , y ;
Exemple introductif
largeur
p u b l i c Forme(double x , double y ) { v2
this.x = x; r
hauteur
this.y = y; x,y
}
x,y x,y v1
p u b l i c void deplacer(double d x ,
double dy) {
x += d x ; y += d y ; Forme
} double x,y; //point deréférence
} Forme (double x,y)
deplacer(double dx,dy)
p u b l i c class Cercle extends Forme {
protected double r ;

p u b l i c Cercle(double x , double y, double


r) {
super( x , y ) ;
this.r = r; Cercle Rectangle Triangle
}
double r; //rayon double largeur,hauteur; double x1,y1; //v1
p u b l i c double surface(){ Cercle(double x,y,r) Rectangle(double x,y,l,h) double x2,y2; //v2
r e t u r n Math.PI * r * r ; double surface() double surface() Triangle(double x,y,x1,y1,x2,y2)
} double perimetre() double perimetre(); double surface()
double perimetre();
protected double perimetre(){
r e t u r n 2 * Math.PI * r ;
} Samia BA LEBIBE - DECEMEBRE 2020
}
Classes abstraites
5 Exemple introductif
p u b l i c class ListeDeFormes {

p u b l i c s t a t i c f i n a l i n t NB_MAX= 30; On veut pouvoir


p r i v a t e Forme[] tabFormes = new Forme[NB_MAX]; gérer des listes
p r i v a t e i n t nbFormes = 0 ;
de formes
p u b l i c void ajouter(Forme f ) {
i f (nbFormes < NB_MAX) { On exploite le polymorphisme
tabFormes[nbFormes] = f ; } la prise en compte de nouveaux
} types de forme ne modifie pas le
p u b l i c void toutDeplacer(double dx,double dy) {
code
f o r ( i n t i = 0 ; i < NbFormes; i + + ) Appel non valide car la méthode
tabFormes[i] .deplacer(dx ,dy) ;
perimetre n’est pas implémentée
}
au niveau de la classe Forme

p u b l i c double p e r i m e t r e To t a l ( ) {
double perimTotal = 0 . 0 ; Définir uneméthode
f o r ( i n t i = 0 ; i < nbFormes++; i + + ) perimetre dans Forme ?
perimTotal += t a b F o r m e s [ i ] . p e r i m e t r e ( ) ;
r e t u r n perimTotal; p u b l i c double p e r i m e t r e ( ) {
erreur de
} r e t u r n 0 . 0 ; / / ou - 1 . ??
compilation BOF

}
}

Samia BA LEBIBE - DECEMEBRE 2020

Une solution propre et élégante : les classesabstraites


Classes abstraites
6
p u b l i c abstract class Forme { la classe doit être
Classe abstraite protected double x , y ; déclarée comme étant
explicitement abstraite
p u b l i c Forme(double x , double y ) {
this.x = x;
this.y = y;
}

p u b l i c void deplacer(double d x ,
on spécifie qu'un objet
double dy) {
de type Forme aura une
x += d x ; y += d y ;
méthode périmètre et
}
une méthode surface
Méthodes abstraites public abstract double perimetre() ;
par contre on ne sait pas
public abstract double sur f a c e ( ) ; comment cela sera
implémenté 
}
méthodes sans corps :
 Utilité : ; au lieu de { … }
 définir des concepts incomplets qui devront être implémentés dans les sous classes

 factoriser le code
 les opérations abstraites sont particulièrement utiles pour mettre en œuvre le
polymorphisme.
l'utilisation du nom d'une classe abstraite comme type pour une (des) référence(s) est
toujours possible (et souvent souhaitable !!!)
Samia BA LEBIBE - DECEMEBRE 2020
Classes abstraites
7
 classe abstraite : classe non instanciable, c'est à dire qu'elle n'admet pas
d'instances directes.
 Impossible de faire new ClasseAbstraite(…);
 mais une classe abstraite peut néanmoins avoir un ou des constructeurs

 opération abstraite : opération n'admettant pas d'implémentation


 au niveau de la classe dans laquelle elle est déclarée, on ne peut pas dire
comment la réaliser.

 Une classe pour laquelle au moins une opération abstraite est déclarée est une classe
abstraite (l'inverse n'est pas vrai).

p u b l i c abstract class ClasseA { p u b l i c abstract class ClasseA {

... ...

public abstract void methodeA();

...
} la classe contient une méthode } la classe ne contient pas de
abstraite => elle doit être méthode abstraite => elle peut
déclaréeSamia
abstraite
BA LEBIBE - DECEMEBRE 2020
être déclarée abstraite
Classes abstraites
8

 Une classe abstraite est une description d'objets destinée à être héritée par des classes plus
spécialisées.
 Pour être utile, une classe abstraite doit admettre des classes descendantes concrètes.
 Toute classe concrète sous-classe d'une classe abstraite doit “concrétiser” toutes les
opérations abstraites de cette dernière.
 elle doit implémenter toutes les méthodes abstraites
 Une classe abstraite permet de regrouper certaines caractéristiques communes à ses sous-
classes et définit un comportement minimal commun.
 La factorisation optimale des propriétés communes à plusieurs classes par généralisation
nécessite souvent l'utilisation de classes abstraites.

Samia BA LEBIBE - DECEMEBRE 2020


Classes abstraites
9 Classes abstraites et diagrammes de classesUML
«abstract»
classe abstraite Forme
Forme
x : double
y : double
deplacer(x:double, y:double)
perimetre() : double opération abstraite

classe concrète
classe abstraite
(perimetre() est
Rectangle ... FormeCirculaire héritée et non
concrétisée)
l a r g e u r : double rayon: double
hauteur : double utile que si spécialisée
perimetre() double
Disque Couronne
opération concrétisée rayonInterne : double
perimetre() double
Samia BA LEBIBE - DECEMEBRE 2020
perimetre() double
Classes abstraites
10 Exemple introductif
p u b l i c class Forme
abstract { Forme {
class
protected double x , y ;
public class ListeDeFormes {
p u b l i c Forme(double x , double y ) {
public static final int NB_MAX = 30;
this.x = x;
private Forme[] tabFormes = new Forme[NB_MAX];
this.y = y;
private int nbFormes = 0;
}
public void ajouter(Forme f) { if
p u b l i c void deplacer(double d x ,
(nbFormes < NB_MAX) {
double dy) {
tabFormes[nbFormes] =f;
x += d x ; y += d y ;
nbFormes++; }
}
}
} public abstract double perimetre();
public void toutDeplacer(double dx,double dy) {
public abstract double surface();
for (int i=0; i < NbFormes; i++)
}
tabFormes[i].deplacer(dx,dy);
}
Le polymorphisme peut être pleinement
public double perimetreTotal() { exploité. Le compilateur sait que
double perimTotal = 0.0; chaque objet Forme peut calculer son
for (int i=0; i < nbFormes++; i++) périmètre
perimTotal += tabFormes[i].perimetre();
return perimTotal;
}
}
Samia BA LEBIBE - DECEMEBRE 2020
Classes abstraites
11
public abstract class Magnitude {

public abstract boolean egalA(Magnitude m) ;

public abstract boolean inferieurA(Magnitude m) ;

public boolean superieurA(Magnitude m)


{
Magnitude
return !egalA(m) &&! i n f e r i e u r A ( m ) ;
egalA(obj : Magnitude) : boolean opérations
}
... inferieurA(obj : Magnitude) : boolean abstraites
opérations concrètes
(basées sur les 2 superieurA(obj : Magnitude) : boolean
opérations abstraites) ...

Date Caractère ... Nombre


chaque sous-classe
concrète admet une
implémentation différente
pour egalA() et
inferieurA() Réel ... Entier

Samia BA LEBIBE - DECEMEBRE 2020


12

Héritage et abstraction
Interfaces

Samia BA LEBIBE - DECEMEBRE 2020


Interfaces
13
Exemple introductif

abstract class Animal {


...
abstract void t a l k ( ) ;
}

class Dog extends Animal { class Bird extends Animal { class Cat extends Animal {
... ... ...
void talk() { void t a l k ( ) { void talk() {
System.out.println("Woof!"); System.out.println("Tweet"); System.out.println("Meow");
} } }
} } }

Polymorphisme signifie qu’une référence d’un type


En JAVA le polymorphisme est rendu possible par la
(classe) donné peut désigner un objet de n’importe
liaison dynamique (dynamic binding)
quelle sous classe et selon la nature de cet objet
produire un comportement différent
class Interrogator {
s t a t i c void makeItTalk(Animal subject) {
Animal animal = new Dog();
subject.talk();
...
}
animal = new C a t ( ) ;
}

animal peut être un Chien, un Chat ou


Samia BA LEBIBE - DECEMEBRE 2020
JVM décide à l’exécution (runtime) quelle méthode
n’importe quelle sous classe d'Animal invoquer en se basant sur la classe de l’objet
Interfaces
14 Exemple introductif
Comment utiliser Interrogator pour faire parler aussi un CuckooClock ?
Faire rentrer
CuckooClock dans la
hiérarchie Animal ?
abstract class Animal { class Clock {
abstract void t a l k ( ) ; ...
} } Pas d’héritage multiple

class Dog extends Animal {


class CuckooClock extends Clock {
void t a l k ( ) { class Bird extends Animal {
System.out.prin public void talk() {
tln(« wooh »); class Cat extends Animal {
System.out.println("Tweet"); System.out.println("Cuckoo,
void t a l k ( ) { cuckoo!");
} } } System.out.println("Meow."); }
} } }
}

class Interrogator class CuckooClockInterrogator {


{
static void makeItTalk(Animal subject) { static void makeItTalk(Cuckooclock subject)
subject.talk(); { subject.talk();
} }
} }

Se passer du
Samia BA LEBIBE - DECEMEBREpolymorphisme
2020 ?
Interfaces
15 Exemple introductif
 Les interfaces permettent plus de polymorphisme car avec les interfaces il n’est
pas nécessaire de tout faire rentrer dans une seule famille (hiérarchie) de classes

abstract class Animal {implements Talkative { class Clock {


abstract void t a l k ( ) ; ...
} }
Association de ce type à
différentes classes de la
hiérarchie d’héritage
class Dog extends Animal {
void t a l k ( ) { class Bird extends Animal { class CuckooClock extends extends
ClockClock {
implements Talkative {
System.out. Print(« wooh »); public void t a l k ( ) {
Syst em. out . pr i nt l n( " Cuckoo
} void talk(){ , cuckoo!");
} System.out.println("Tweet"); }
} } }

class Interrogator { interface Talkative {


static void makeItTalk
(Animal subject)
(Talkative {
subject) { public void t a l k ( ) ;
subject.talk(); }
}
}

Définition d’un type


Utilisation de ce type abstrait
abstrait (interface)
Samia BA LEBIBE - DECEMEBRE 2020
Interfaces
16
Déclaration d’une interface
 Une interface est une collection d'opérations utilisée pour spécifier un service offert
par une classe.
 Une interface peut être vue comme une classe 100% abstraite sans attributs et
dont toutes les opérations sont abstraites.

p u b l i c i n t e r f a c e Dessinable { Possibilité
d'im plém en-
Une interface non publique p u b l i c void dessiner(Graphics g ) ; tation par
n'est accessible que dans void effacer(Graphics g ) ; défaut avec
}
son package

Dessinable.java
Une interface publique
doit être définie dans un
fichier . j a v a de même
nom
«interface» interface
Dessinable
opérations abstraites
dessiner(g : Graphics)
Samia BA LEBIBE - DECEMEBRE 2020 effacer(g: Graphics)
Interfaces
17
Déclaration d’une interface
 Possibilité de définir des attributs à condition qu’il s’agisse d’attributs de type
primitif
 Ces attributs sont implicitement déclarés comme static final

import java.awt.Graphics;
public interface Dessinable {
public static final int MAX_WIDTH = 1024;
int MAX_HEIGHT = 768;
public void dessiner(Graphics g);
void effacer(Graphics g);
}

Dessinable.java

Samia BA LEBIBE - DECEMEBRE 2020


Interfaces
18
"réalisation" d’une interface
 Une interface est destinée à être “réalisée” (implémentée) par d’autres classes (celles-ci en
héritent toutes les descriptions et concrétisent les opérations abstraites).
 Les classes réalisantes s'engagent à fournir le service spécifié par Forme
l'interface double x,y; //centre du cercle
Forme (double x,y)
double surface()
 L’implémentation d’une interface est libre. double périmètre()
<< interface>>
 Il n'existe pas nécessairement de relations deplacer(doubledx,dy)
Dessinable
entre les différentes classes dessiner(Graphics g)
d'implémentation effacer(Graphics g)
Rectangle
double largeur,hauteur;
Clock Rectangle(doublex,y,l,h)
… double surface()
double périmètre();
TexteDessinable
CuckooClock
String txt; réalisation
int x,y; RectangleDessinable

Fontf; Color c
dessiner(Graphics g)
... opérations RectangleDessinable(double x,y,l,h ,
effacer(Graphics g);
dessiner(Graphics g) concrétisées Color c)
… dessiner(Graphics g)
effacer(Graphics g);
Samia BA LEBIBE - DECEMEBRE 2020
… effacer(Graphics g)
Interfaces
19 "réalisation" d’une interface
 De la même manière qu'une classe étend sa super-classe elle peut de manière
optionnelle implémenter une ou plusieurs interfaces
 dans la définition de la classe, après la clause extends Forme
nomSuperClasse, faire apparaître explicitement le mot clé double x,y; //centre du cercle
implements suivi du nom de l'interface implémentée Forme (double x,y)
double surface()
class RectangleDessinable extends Rectangle implements Dessinable { double périmètre()
p r i v a t e Color c ; deplacer(doubledx,dy)

p u b l i c RectangleDessinable(double x , double y, double l , << interface>>


double h , Color c ) { Dessinable
supe r ( x, y , l , h ) ; dessiner(Graphics g) Rectangle
this.c = c; effacer(Graphics g) double largeur, hauteur;
}
Rectangle(doublex,y,l,h)
public void dessiner(Graphics g ) { double surface()
g.drawRect((int) x , ( i n t ) y, ( i n t ) largeur, ( i n t ) hauteur); double périmètre();
}
public void effacer(Graphics g ) {
g . c l e a r R e c t ( ( i n t ) x , ( i n t ) y, ( i n t ) l a r g e u r, ( i n t ) hauteur);
} RectangleDessinable
} Color c
RectangleDessinable(double x,y,l,h ,
 si la classe est une classe concrète elle doit fournir une Color c)
dessiner(Graphics g)
implémentation Samia
(un BA
corps) à chacune des méthodes abstraites
LEBIBE - DECEMEBRE 2020 effacer(Graphics g)
définies dans l'interface (qui doivent être déclarées publiques)
Interfaces
20 "réalisation" d’une interface
 Une classe JAVA peut implémenter simultanément plusieurs interfaces

 la liste des noms des interfaces à implémenter séparés par Forme


des virgules doit suivre le mot clé implements double x,y; //centre du cercle
Forme (double x,y)
double surface()
class RectangleDessinable extends Rectangle
implements Dessinable , Enregistrable { double périmètre()
p r i v a t e Color c ; deplacer(doubledx,dy)

p u b l i c RectangleDessinable(double x , double y,
<< interface>>
double l , double h , Color c ) { Dessinable
supe r ( x, y , l , h ) ; dessiner(Graphics g) Rectangle
this.c = c; effacer(Graphics g) double largeur,hauteur;
} Rectangle(doublex,y,l,h)
public void dessiner(Graphics g ) { double surface()
g.drawRect((int) x , ( i n t ) y, ( i n t ) largeur, ( i n t ) hauteur); double périmètre();
}
public void effacer(Graphics g ) {
g . c l e a r R e c t ( ( i n t ) x , ( i n t ) y, ( i n t ) l a r g e u r, ( i n t ) hauteur);
} RectangleDessinable
Color c
public void enregistrer(File f ) { RectangleDessinable(double x,y,l,h ,
<< interface>>
... Color c)
} Enregistrable dessiner(Graphics g)
Samia BA LEBIBE - DECEMEBRE 2020 enregistrer(File f) effacer(Graphics g)
} enregistrer(File f )
Interfaces
21 "réalisation" d’une interface
 pour éviter des redéfinitions de méthodes penser à mettre
des directives @Override lors de l’implémentation des
méthodes d'une interface Forme
double x,y;//centre du cercle
Forme (double x, y)
class RectangleDessinable extends Rectangle
double surface()
implements Dessinable , Enregistrable {
p r i v a t e Color c ; double périmètre()
deplacer(double
p u b l i c RectangleDessinable(double x , double y, dx,dy)
double l , double h , Color c ) {
<< interface>>
supe r ( x, y , l , h ) ; Dessinable
this.c = c; dessiner(Graphics g) Rectangle
} effacer(Graphics g) double largeur,hauteur;
@Override Rectangle(double x,y,l,h)
public void dessiner(Graphics g ) { double surface()
g.drawRect((int) x , ( i n t ) y, ( i n t ) largeur, ( i n t ) hauteur);
double perimetre();
}
@Override
public void effacer(Graphics g ) {
g . c l e a r R e c t ( ( i n t ) x , ( i n t ) y, ( i n t ) l a r g e u r, ( i n t ) hauteur);
RectangleDessinable
}
Color c
@Override RectangleDessinable(double x,y,l,h ,
<< interface>>
public void enregistrer(File f ) { Color c)
Enregistrable dessiner(Graphics g)
...
} enregistrer(File f) effacer(Graphics g)
enregistrer(File f)
} Samia
Samia BA LEBIBE - DECEMEBRE 2020 BA Déc
Interfaces
22
interêt

 Les interfaces permettent de s’affranchir d’éventuelles contraintes


d’héritage.
 Lorsqu’on examine une classe implémentant une ou plusieurs interfaces, on
est sûr que le code d’implémentation est dans le corps de la classe.
 Excellente localisation du code (défaut de l’héritage multiple, sauf si on hérite
de classes purement abstraites).

 Permet une grande évolutivité du modèle objet

Samia BA LEBIBE - DECEMEBRE 2020


23 Classe abstraite vs
Interface
 Lors de la conception d'une application, le choix conceptuel entre une
classe abstraite et une interface n'est pas toujours facile.
 Parmi les points à prendre en considération, on peut rappeler que :
 Une classe peut implémenter plusieurs interfaces mais ne peut hériter
que d'une seule classe abstraite.
 Une interface peut être implémentée par une classe sans qu'il y ait de
rapports étroits entre les deux. Une sous-classe est liée par une
relation plus forte (Héritage ).

Samia BA LEBIBE - DECEMEBRE 2020

Vous aimerez peut-être aussi