Niveau: 2ème Année GL/RT
Enseignante: Sana HAMDI
Email: [Link]@[Link]
[Link]@[Link]
Chapitre1: Introduction à la programmation orientée objet
Chapitre2: Notions de base Java
Chapitre3: Classes et Objets Java
Chapitre4: Héritage, Polymorphisme et Classes Abstraites
Chapitre5: Les Interfaces
Chapitre6: Les Exceptions
2
CHAPITRE 6
3
PLAN DU CHAPITRE 6
1. Problème du diamant
2. Les interfaces
3. Héritage d’interfaces
4. Exemple
4
PLAN DU CHAPITRE 6
1. Problème du diamant
2. Les interfaces
3. Héritage d’interfaces
4. Exemple
5
L’héritage
est un paradigme important de la programmation
Orientée Objet.
Avec l’héritage multiple, se pose le problème du diamant (problème
du losange).
6
La classe D hérite de deux classes B et C, elles-mêmes filles d'une
même classe A.
Un problème de conflit se pose lorsque des méthodes ou des
attributs des classes B et C portent le même nom.
Le nom de ce problème (diamant ou losange) provient de la forme
du schéma d'héritage des classes A, B, C et D dans ce cas.
Pour cela ce mécanisme n'existe pas en Java!!
Sana Hamdi 13/11/2023 7
Comment faire pour bien concevoir en java des cas réels
basés sur l’héritage multiple?
Solution : les interfaces
Sana Hamdi 13/11/2023 8
PLAN DU CHAPITRE 6
1. Problème du diamant
2. Les interfaces
3. Héritage d’interfaces
4. Exemple
9
Présentation:
Une interface définit un comportement d’une classe, sans implémenter
ce comportement.
C’est un ensemble de méthodes abstraites, et de constantes.
Une interface ne peut pas être instanciée, elle ne peut être que
implémentée par des classes.
Une classe qui implémente une interface doit fournir le code approprié
des méthodes abstraites.
10
Une classe peut implémenter plusieurs interfaces
Une interface peut hériter de plusieurs autres interfaces
On peut déclarer des variables dont le type est une interface.
Une classe qui hérite d'une autre classe et qui implémente une interface:
doit mettre dans l'ordre l'hér itage (extends) puis l'implémentation
(implements)
11
Syntaxe:
// une interface est soit publique soit accès paquetage(default)
interface interface_exemple [extends noms d'interfaces]{
// déclaration des constantes(public static final facultatifs)
int MAX=100;
// entête d’une méthode F (public abstact facultatifs)
int F(int n);
// entête d’une méthode g (public abstact facultatifs)
void g();
}
Le corps d'une interface est une énumération de constantes et de méthodes
sans la définition de leurs codes.
Sana Hamdi 13/11/2023 12
Syntaxe d’implémentation: Utilisation d'une interface par une classe
public interface I1 {
void f ( );
}
public interface I2 {
int g (int);
} La classe A implémente les
public interface I3 extends I2 { fonctionnalités des interfaces I1 et I3
float h (int);
}
class A implements I1, I3 {
/* A doit obligatoirement implémenter les méthodes f, g et h prévues dans I1 et I3 qui
hérite de I2*/
}
13
Interface
«interface»
import [Link].*; Dessinable
public interface Dessinable {
public void dessiner(Graphics g); Opérations dessiner(g : Graphics)
public void effacer (Graphics g); abstraites
}
effacer(g: Graphics)
[Link]
class RectangleDessinable extends Rectangle implements Dessinable {
public void dessiner (Graphics g){
[Link]((int) x, (int) y, (int) largeur, (int) hauteur);
}
public void effacer(Graphics g){
[Link]((int) x, (int) y, (int)largeur, (int) hauteur);
}
} 14
class RectangleDessinable extends Rectangle implements Dessinable,Comparable {
public void dessiner(Graphics g){
[Link]((int) x, (int) y, (int) largeur, (int) hauteur);
}
public void effacer(Graphics g){
[Link]((int) x, (int) y, (int)largeur, (int) hauteur);
}
public int compareTo(Object o) {
if (o instanceof Rectangle)
...
}
}
Méthodes de l’interface Méthodes de l ’interface
Comparable Dessinable
15
Diagramme de classe:
16
PLAN DU CHAPITRE 6
1. Problème du diamant
2. Les interfaces
3. Héritage d’interfaces
4. Exemple
17
De la même manière qu'une classe peut avoir des sous-classes, une
interface peut avoir des "sous-interfaces "
Une sous interface:
hérite toutes les méthodes abstraites et les constantes de sa "super-interface"
peut définir de nouvelles constantes et méthodes abstraites
interface Set extends Collection
{
...
}
18
À la différence des classes, une interface peut étendre plus d'une
interface à la fois.
package [Link];
interface ByteChannel extends ReadableByteChanel, WriteableByteChanel {
}
19
Déclaration d'une méthode par défaut
fournir un corps à la méthode
qualifier la méthode avec le mot clé default
Les classes filles sont libérées de fournir une implémentation d'une
méthode default, en cas d'absence d’ implémentation spécifique c'est
la méthode par défaut qui est invoquée.
Ceci est utile si on veut ajouter ultérieurement une méthode
Ce mécanisme n'existe qu'à partir de Java 8. Jusqu'en Java 7 il n'est pas
possible de créer des méthodes par défaut dans les interfaces.
20
Erreur: la classe Cls, utilisera quelle méthode ?
21
Pour résoudre le conflit, il existe une seule solution :
Implémenter la méthode au niveau de la classe elle-même, car
l'implémentation de la classe est toujours prioritaire
22
23
Une méthode statique est un élément que l'on peut rencontrer dans
une classe normale.
Un appel statique se fait au travers de la classe, il n'a pas besoin
d'aucune instance pour être exécuté.
Java 8 autorise des méthodes statiques dans les interfaces, qui
obéissent aux mêmes règles que celles que l'on trouve dans les
classes abstraites ou concrètes.
24
Exemple
public interface Reproduction {
public static void description() {
[Link]("Méthode statique dans une interface");
}
}
public class Main {
public static void main(String[] args) {
[Link]();
}
}
25
Depuis Java 9, on peut ajouter des méthodes privées et des méthodes statiques
privées dans les interfaces.
Ces méthodes privées amélioreront la réutilisation du code dans les interfaces. Par
exemple, si deux méthodes par défaut avaient besoin de partager du code, une
méthode d'interface privée leur permettrait de le faire, mais sans exposer cette
méthode privée à ses classes d'implémentation.
L'utilisation de méthodes privées dans les interfaces obéit à quatre règles :
La méthode d'interface privée ne peut pas être abstraite.
La méthode privée ne peut être utilisée qu'à l'intérieur de l'interface.
La méthode statique privée peut être utilisée dans d'autres méthodes d'interface statiques
et non statiques.
La méthode non statique privée ne peut pas être utilisée dans des méthodes statiques.
26
27
Intérê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
Permet une grande évolutivité du modèle objet
28
Bien que la vocation d'une interface soit d'être implémentée par une classe, on peut
définir des variables de type interface.
public interface I {…}
void main (String [] args){
I i;
…}
On ne pourra pas affecter à i une référence à quelque chose de type I puisqu'on ne
peut pas instancier une interface (pas plus qu'on ne pouvait instancier une classe
abstraite!).
En revanche, on pourra affecter à i n'importe quelle référence à un objet d'une classe
implémentant l'interface I (Surclassement)
class A implements I{…}
void main (String [] args){
I i = new A(…);//OK
29
PLAN DU CHAPITRE 6
1. Problème du diamant
2. Les interfaces
3. Héritage d’interfaces
4. Exemple
30
abstract class Animal {
...
abstract void talk();
}
class Dog extends Animal { class Bird extends Animal { class Cat extends Animal {
... ... ...
void talk() { void talk() { void talk() {
[Link]("Woof!"); [Link]("Weet"); [Link](« Miaw!");
} } }
} } }
Polymorphisme signifie qu’une référence d’un
En JAVA le polymorphisme est rendu possible
type (classe) donné peut désigner un objet de
par la liaison dynamique (dynamic binding)
n’importe quelle sous classe et selon la nature de
cet objet produire un comportement différent
class Interrogator {
Animal animal = new Dog(); static void makeItTalk(Animal subject) {
... [Link]();
animal = new Cat(); }
[Link](animal) }
animal peut être un Chien, un Chat ou JVM décide à l’exécution (run-time) quelle méthode
n’importe quelle sous classe d ’Animal invoquer en se basant sur la classe de l’objet
31
Question:
Comment utiliser la classe Interrogator pour faire parler aussi un CuckooClock ?
32
Faire passer
CuckooClock dans la
abstract class Animal hiérarchie d’animal?
{
...
abstract class Clock{
abstract void
...
talk();
Pas
}
} d’héritage
multiple
class Dog extends Animal {
... class Bird extends Animal {
void talk() { ... class Cat extends Animal { class CuckooClock {
void talk() {
[Link]("Woof!"); ... ...
} [Link]("Weet");
void talk() { void talk() {
} } [Link](« Miaw!"); [Link](« cuckoo »);
} } }
} }
class Interrogator { class Interrogator {
static void makeItTalk(Animal subject) static void makeItTalk(CuckooClock subject)
{ {
[Link](); [Link]();
} }
} }
Se passer du 33
polymorphisme?
abstract class Animal implements Talkative
{
... abstract class Clock{
abstract void talk(); Association de ce type ...
} à différentes classes
de la hiérarchie }
d’héritage
class Dog extends Animal {
... class Bird extends Animal {
void talk() { ... class Cat extends Animal {
[Link]("Woof!");
void talk() { ... class CukooClock implements Talkative {
} void talk() {
[Link]("Weet"); void talk() {
} }} [Link](« cuckoo »);
[Link](« Miaw!"); }}
}}
class Interrogator {
static void makeItTalk(Talkative subject) { interface Talkative {
[Link](); public void talk();
} }
}
Définition d’un
Utilisation de ce
type abstrait
type abstrait
(interface)
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 classe 34
Une interface ne peut pas contenir des méthodes déjà implémentées (sauf des par
défaut, privées ou statiques).
Une classe, ou une classe abstraite peut implémenter plusieurs interfaces, mais n’a
qu’une super classe, alors qu’une interface peut dériver de plusieurs autres
interfaces.
Des classes non liées hiérarchiquement peuvent implémenter la même interface
35
Une interface est un moyen d’attribuer des composants communs à des classes
non liées par une relation d’héritage.
36
37
Merci pour votre attention !
Dr. Sana Hamdi
Maitre Assistante en Informatique à l’INSAT
Membre du Laboratoire LIPAH (FST-Tunisie)
et du Laboratoire SAMOVAR (Telecom SudParis-France)