Vous êtes sur la page 1sur 23

Universit Cadi Ayyad

Ecole Suprieure de Technologie Safi

Cours de la programmation oriente


objet (JAVA)

Pr. SAID EL ABDELLAOUI


Elabdellaoui.said@yahoo.fr

Cours 4 : Polymorphisme

Said El Abdellaoui Programmation Oriente Objet : Java 2016 / 2017


POLYMORPHISME
SOUCI !!!!
3

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);
} }

static void uneRencontre (Personnage a,


class Guerrier extends Personnage{ Personnage b) {
// ... System.out.print(a.getNom()+" rencontre ");
public void rencontrer(Personnage p) { System.out.print(b.getNom() +" ");
System.out.print("Boum !"); a.rencontrer(b);
} }
} }

Sad EL ABDELLAOUI Oriente Objet : Java 2016 / 2017


POLYMORPHISME (UNIVERSEL DINCLUSION)
4

En POO, le polymorphisme (universel dinclusion) est le fait que les instances dune sous-
classe gardent leurs propres proprits.

Le choix des mthodes invoquer se fait lors de lexcution du programme en fonction de la


nature relle des instances concernes. La mise en uvre se fait au travers de :
Personnage p1,p2;
lhritage (hirarchies de classes) ; // ...
la rsolution dynamique des liens. p1.rencontrer(p2);

Sad EL ABDELLAOUI Oriente Objet : Java 2016 / 2017


MTHODES ABSTRAITES
BESOIN DE MTHODES ABSTRAITES : EXEMPLE
6

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) !

Solution : dclarer la mthode surface comme abstraite.

Sad EL ABDELLAOUI Oriente Objet : Java 2016 / 2017


BESOIN DE MTHODES ABSTRAITES : EXEMPLE
7

Premire solution :
Ajouter une mthode quelconque dfinie arbitrairement :

class Personnage{
// ...
// On n'affiche rien : corps de la mthode vide
public void afficher(){ }
// ...
}

Mauvais modle de la ralit

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

Sad EL ABDELLAOUI Oriente Objet : Java 2016 / 2017


MTHODES ABSTRAITES : DFINITION ET SYNTAXE
8

Syntaxe :

abstract Type nom_methode (liste darguments);

Exemples :

abstract class FigureFermee{


public abstract double surface();
public abstract double perimetre();
// On peut utiliser une mthode abstraite :
public double volume (double hauteur) {
return hauteursurface(); }
}

abstract class Personnage{


// ...
public abstract void afficher();
// }

Sad EL ABDELLAOUI Oriente Objet : Java 2016 / 2017


CLASSES ABSTRAITES
9

Une classe abstraite ne peut tre instancie.


Ses sous-classes restent abstraites tant quelles ne fournissent pas les dfinitions de toutes
les mthodes abstraites dont elles hritent.

Une autre quipe cre la sous-classe Guerrier de Personnage et veut lutiliser :

Jeu jeu= new Jeu();


jeu.ajouterPersonnage (new Guerrier(...));

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 :

Guerrier is abstract; cannot be instantiated

Sad EL ABDELLAOUI Oriente Objet : Java 2016 / 2017


MTHODES ABSTRAITES : AUTRES EXEMPLES
10

class Polygone extends FigureFermee {


class Cercle extends FigureFermee {
private ArrayList <double> cotes; }
private double rayon;
}
}
public double perimetre() {
public double surface() {
double p=0.0;
return Math.PIrayonrayon;
for (double cote : cotes) {
}
p+ =cote;
public double perimetre() {
}
return 2.0Math.PIrayon;
return p;
}
}

Cercle nest pas une classe abstraite Polygone reste par contre une classe abstraite

Sad EL ABDELLAOUI Oriente Objet : Java 2016 / 2017


CONSTRUCTEURS ET POLYMORPHISME
11

Un constructeur est une mthode spcifiquement ddie la construction de


linstance courante dune classe, il nest pas prvu quil ait un comportement
polymorphique.
Il est cependant possible dinvoquer une mthode polymorphique dans le corps dun
constructeur.
Ceci est cependant dconseill: la mthode agit sur un objet qui nest peut-
tre alors que partiellement initialis !!

Sad EL ABDELLAOUI Oriente Objet : Java 2016 / 2017


CONSTRUCTEURS ET POLYMORPHISME
12

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();

Sad EL ABDELLAOUI Oriente Objet : Java 2016 / 2017


LA SUPER-CLASSE OBJECT
13

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 :

Object v=new UneClasse(...); // OK

Sad EL ABDELLAOUI Oriente Objet : Java 2016 / 2017


LA SUPER-CLASSE OBJECT
14

La classe Object dfinit, entre autres, les mthodes :

toString : qui affiche juste une reprsentation de ladresse de lobjet.


equals : qui fait une comparaison au moyen de == (comparaison des
rfrences).
clone : qui permet de copier linstance courante.

Dans la plupart des cas, ces dfinitions par dfaut ne sont pas satisfaisantes quand
vous dfinissez vos propres classes

Vous tes amens les redfinir pour permettre un affichage, une


comparaison ou une copie corrects de vos objets
Cest ce que nous avons fait dans une squence prcdente avec toString !
La classe String aussi par exemple redfinit ces mthodes

Sad EL ABDELLAOUI Oriente Objet : Java 2016 / 2017


EXEMPLE : REDFINITION DE EQUALS HRIT DE OBJECT
15

Lentte propose pour la mthode equals dans une squence prcdente tait :

public boolean equals(UneClasse arg)

or lentte de la mthode equals dans Object est :

public boolean equals(Object arg)

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.

Sad EL ABDELLAOUI Oriente Objet : Java 2016 / 2017


SURCHARGE, REDFINITION ( RAPPELS )
16

On redfinit ( override ) une mthode dinstance si les paramtres et leurs types


sont identiques et les types de retour compatibles :

public boolean equals(Object arg)

Si cest le mme nom de mthode seulement, on surcharge ( overload ) :

public boolean equals(UneClasse arg)

Sad EL ABDELLAOUI Oriente Objet : Java 2016 / 2017


REDFINITION USUELLE DE EQUALS
17

Attention ! si lon redfinit equals pour la classe Rectangle, on doit pouvoir


comparer un Rectangle avec nimporte quel autre objet : unRectangle.equals("toto")
devrait retourner false.
class Rectangle{
//...
public boolean equals(Object autreObjet) {
}
}
if (autreObjet == null)
{ return false; }
else{
if (autreObjet.getClass() != getClass())
}
{ return false; }
else{
Rectangle r= (Rectangle) autreObjet;
return (largeur == r.largeur && hauteur == r.hauteur);
}

Sad EL ABDELLAOUI Oriente Objet : Java 2016 / 2017


LE MODIFICATEUR FINAL
18

Ce modificateur permet dindiquer les lments du programme qui ne doivent pas


tre modis / rednis /tendus

Possible pour les classes, mthodes, attributs, variables.


Utile surtout pour les variables.
Moins courant pour les mthodes et les classes.

Sad EL ABDELLAOUI Oriente Objet : Java 2016 / 2017


MTHODES FINALES
19

Si lon ajoute final une mthode :


Impossible de la redfinir dans une sous-classe
Exemple : on aimerait toujours appliquer la mthode vieillir de Personnage

class Personnage
{
//...
final void vieillir() {
-- dureeVie;
}
}

Message derreur du compilateur si la classe Sorcier essaie de redfinir la


mthode vieillir

Sad EL ABDELLAOUI Oriente Objet : Java 2016 / 2017


CLASSES FINALES
20

Si lon ajoute final une classe :


Impossible dtendre la classe par une sous-classe
Exemple : on aimerait que la classe Sorcier nait jamais de sous-classe

final class Sorcier extends Magicien{


//...
}
class MageNoir extends Sorcier{ ..}
// illicite!!

Message derreur du compilateur si la classe Sorcier essai de redfinir la


mthode vieillir.

Sad EL ABDELLAOUI Oriente Objet : Java 2016 / 2017


CLASSES ET MTHODE FINALES
21

Les mthodes et classes finales peuvent tre priori agaantes :


Exemple: la classe prdfinie String est finale
Aucune possibilit de dfinir

class MyString extends String

an damliorer certaines mthodes par redfinition!!

Mais, permet de fixer une fois pour toute le comportement dune classe ou
mthode

Sad EL ABDELLAOUI Oriente Objet : Java 2016 / 2017


VARIABLES FINALES ET OBJETS RFRENCS
22

Si lon ajoute final une variable dinstance, une variable locale ou un paramtre :

il devient impossible de lui affecter une valeur plus dune fois

Un attribut final peut tre initialis dans le constructeur mais ne doit plus tre modifi
par la suite

Attention : final empche laffectation dune nouvelle valeur une variable,


mais nempche pas de modifier lventuel objet rfrenc par cette variable

Sad EL ABDELLAOUI Oriente Objet : Java 2016 / 2017


VARIABLES FINALES ET OBJETS RFRENCS
23

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

Sad EL ABDELLAOUI Oriente Objet : Java 2016 / 2017