Poo
Poo
Poo
: Cours 4
import java.util.ArrayList;
import java.util.Calendar;
public class Direction{
public static ArrayList<EPFLien>epfl= new ArrayList<EPFLien>();
afficherStatistiques();
afficherEPFLiens();
}
class Rencontre
class Personnage{ {
// ... public static void main(...) {
public void rencontrer(Personnage p) { Guerrier g=new Guerrier(...);
System.out.print("Bonjour !"); Voleur v= new Voleur(...);
} uneRencontre(g,v);
} }
En POO, le polymorphisme (universel d’inclusion) est le fait que les instances d’une sous-
classe gardent leurs propres propriétés.
Exemple :
class FigureFermee {
//...
// difficile à définir à ce niveau !..
public double surface(...) {???}
// ...pourtant la méthode suivante en aurait besoin !
public double volume(double hauteur) {
return hauteur×surface();
}
}
Définir surface de façon arbitraire sachant qu’on va la redéfinir plus tard n’est pas une bonne
solution (source d’erreurs) !
Première solution :
Ajouter une méthode quelconque définie arbitrairement :
class Personnage{
// ...
// On n'affiche rien : corps de la méthode vide
public void afficher(){ }
// ...
}
Bonne solution : Signaler que la méthode doit exister dans chaque sous-classe sans qu’il
soit nécessaire de la définir dans la super-classe
☞ Déclarer la méthode comme abstraite
Syntaxe :
Exemples :
S’ils ont oublié de définir la méthode afficher, le code ci-dessus génère une
erreur de compilation car on ne peut pas créer d’instance de Guerrier :
Cercle n’est pas une classe abstraite Polygone reste par contre une classe abstraite
abstract classA
Au sommet : {
public abstract void m();
public A() {
m(); // méthode invocable de manière polymorphique
}
}
//========================================
class B extends A{
private int b;
public B() {
b=1; // A() est invoquée implicitement juste avant
}
public void m() {
// définition de m pour la classe B
System.out.println("b vaut : "+b);
}
}
// .... dans le programme principal :
affiche : b vaut 0 B b= new B();
Il existe en Java une super-classe commune à toutes les classes : la classe Object qui
constitue le sommet de la hiérarchie.
Toute classe que vous définissez, si elle n’hérite d’aucune classe explicitement, dérive
de Object .
Il est donc possible d’affecter une instance de n’importe quelle classe à une variable
de type Object :
Dans la plupart des cas, ces définitions par défaut ne sont pas satisfaisantes quand
vous définissez vos propres classes
L’entête proposée pour la méthode equals dans une séquence précédente était :
☞ Nos définitions de equals constituaient jusqu’ici des surcharges et non pas des
redéfinitions de la méthode equals de Object !
Dans la plupart des cas, utiliser une surcharge fonctionne sans problème, mais il est
recommandé de toujours procéder par redéfinition.
class Personnage
{
//...
final void vieillir() {
-- dureeVie;
}
}
☞ Mais, permet de fixer une fois pour toute le comportement d’une classe ou
méthode
Si l’on ajoute final à une variable d’instance, une variable locale ou un paramètre :
Un attribut final peut être initialisé dans le constructeur mais ne doit plus être modifié
par la suite
Supposons que l’on souhaite programmer un jeu mettant en scène les entités
suivantes :
4. Joueur
class Entite
+ void evolue( )
Idéalement, il nous faudrait mettre en place une hiérarchie de classes telle que celle-ci :
Class Graphique
+ Void dessiner(…)
Mais ….Java ne permet que l’héritage simple : chaque sous-classe ne peut avoir qu’une seule
classe parente directe !
Imposer un contenu commun à des sous-classes en dehors d’une relation d’héritage est le rôle
joué par la notion d’interface en Java.
interface Graphique
+Void dessiner(…)
Interface ≠ Classe
Une interface permet d’imposer à certaines classes d’avoir un contenu particulier
sans que ce contenu ne fasse partie d’une classe.
Syntaxe :
Exemple :
interface Graphique{
void dessiner() {//…};
}
interface Interactif{
void gestionClic() {//…};
}
Syntaxe :
Exemple :
Une interface attribue un type supplémentaire à une classe d’objets, on peut donc
:
Déclarer une variable de type interface
Y affecter un objet d’une classe qui implémente l’interface
(éventuellement, faire un transtypage explicite vers l’interface)
Graphique graphique;
Balle balle = new Balle(..);
graphique = balle;
// Autre exemple !
Entite entite = new Balle(..);
graphique = (Graphique) entite; // transtypage indispensable !
Une classe peut implémenter plusieurs interfaces (mais étendre une seule classe)
Séparer les interfaces par des virgules
Exemple :
,
class Balle extends Entite implements Graphique Interactif {
//code de la classe
}
Une interface est un moyen d’attribuer des composants communs à des classes non-liées
par une relation d’héritage :
Ses composants seront disponibles dans chaque classe qui l’implémente.
Composants possibles :
Nous avons vu que l’héritage permet de mettre en place une relation de type « est-
un » entre deux classes.
Lorsqu’une classe a pour attribut un objet d’une autre classe, il s’établit entre les
deux classes une relation de type « a-un » moins forte que l’héritage (on parle de
délégation).
Elle met en place une relation de type « se-comporte-comme » : une Balle « est-
une » entité du jeu, elle « se-comporte-comme » un objet graphique et comme un
objet interactif.