Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Cours 4 : Polymorphisme
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 dinclusion) est le fait que les instances dune sous-
classe gardent leurs propres proprits.
Exemple :
class FigureFermee {
//...
// difficile dfinir ce niveau !..
public double surface(...) {???}
// ...pourtant la mthode suivante en aurait besoin !
public double volume(double hauteur) {
return hauteursurface();
}
}
Dfinir surface de faon arbitraire sachant quon va la redfinir plus tard nest pas une bonne
solution (source derreurs) !
Premire solution :
Ajouter une mthode quelconque dfinie arbitrairement :
class Personnage{
// ...
// On n'affiche rien : corps de la mthode vide
public void afficher(){ }
// ...
}
Bonne solution : Signaler que la mthode doit exister dans chaque sous-classe sans quil
soit ncessaire de la dfinir dans la super-classe
Dclarer la mthode comme abstraite
Syntaxe :
Exemples :
Sils ont oubli de dfinir la mthode afficher, le code ci-dessus gnre une
erreur de compilation car on ne peut pas crer dinstance de Guerrier :
Cercle nest pas une classe abstraite Polygone reste par contre une classe abstraite
abstract classA
Au sommet : {
public abstract void m();
public A() {
m(); // mthode invocable de manire polymorphique
}
}
//========================================
class B extends A{
private int b;
public B() {
b=1; // A() est invoque implicitement juste avant
}
public void m() {
// dfinition 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 hirarchie.
Toute classe que vous dfinissez, si elle nhrite daucune classe explicitement, drive
de Object .
Il est donc possible daffecter une instance de nimporte quelle classe une variable
de type Object :
Dans la plupart des cas, ces dfinitions par dfaut ne sont pas satisfaisantes quand
vous dfinissez vos propres classes
Lentte propose pour la mthode equals dans une squence prcdente tait :
Nos dfinitions de equals constituaient jusquici des surcharges et non pas des
redfinitions de la mthode equals de Object !
Dans la plupart des cas, utiliser une surcharge fonctionne sans problme, mais il est
recommand de toujours procder par redfinition.
class Personnage
{
//...
final void vieillir() {
-- dureeVie;
}
}
Mais, permet de fixer une fois pour toute le comportement dune classe ou
mthode
Si lon ajoute final une variable dinstance, une variable locale ou un paramtre :
Un attribut final peut tre initialis dans le constructeur mais ne doit plus tre modifi
par la suite
Class Conteneur{
}
Private int valeur;
Public void setValeur (int val) {valeur=val; }
//==============================
class Test{
public static void main( String [ ] args ) {
Conteneur c = new Conteneur();
c.setValeur(42);
modifier(c);
}
static void modifier ( final Conteneur c) {
}
}
c.setValeur(-1);// modifie l'objet rfrenc !!
//c = new Conteneur(); //FAUX