Vous êtes sur la page 1sur 30

Le polymorphisme

Polymorphisme : Principe gnral


Le terme de polymorphisme dcrit la caractristique dun lment qui peut . prendre plusieurs formes, comme leau qui se trouve ltat solide, liquide ou gazeux.

Principe de substitution dfinit par Liskov :


Il doit tre possible de substituer nimporte quel objet instance dune sousclasse nimporte quel objet instance dune superclasse sans que la smantique du programme crit dans les termes de la superclasse ne soit affecte.

Principe gnral : exemple


Animal

Lion

Tigre

Ours

Soit Clarance un objet instance de la classe Lion. Clarance peut se substituer des objets de la classe Animal

Clarance : Lion Substitution de Clarance A1 A1 : Animal Clarance : Animal

Polymorphisme et informatique
En informatique, le polymorphisme dsigne un concept de la thorie des types, selon lequel un nom dobjet peut dsigner des instances de classes diffrentes issues dune mme arborescence Animal

Lion

Tigre

Ours

Soit Clarance le nom dun objet de type Animal. Clarance peut donc dsigner des instances des classes Animal, Lion, Tigre et Ours.

Exemple en JAVA
class Animal {} class Lion extends Animal { } class Tigre extends Animal { } class Ours extends Animal { } public class Essai { public static void main (String args []) {Animal clarance; Lion l; clarance = new Lion(); clarance = new Tigre(); clarance = new Lion(); clarance = new Animal(); Lion l = new Animal (); } }
Dclaration des types

Clarance dsigne une instance de la classe Lion

Pas possible car il y a incompatibilit de type

Le polymorphisme dopration (1)


Les interactions entre objets sont dcrites selon les termes des spcifications dfinies, non pas dans les classes des objets, mais dans leurs superclasses.

Animal {abstrait} Dormir() {abstrait}

Lion Dormir()

Tigre Dormir()

Ours Dormir()

Dormir ( ) { Sur le ventre }

Dormir ( ) { Sur le dos }

Dormir ( ) { Dans un arbre }

Le polymorphisme dopration (2)


Chaque sous-classe hrite de la spcification des oprations de ses surperclasses, mais a la possibilit de modifier localement le comportement de ces oprations, afin de mieux prendre en compte les particularismes lis un niveau dabstraction donn. De ce point de vue, une opration donne est polymorphe puisque sa ralisation peut prendre plusieurs formes.

Le polymorphisme dopration : exemple en JAVA


abstract class Animal { abstract public void dormir ( ); } class Lion extends Animal { public void dormir ( ) {System.out.println ("Sur le ventre"); }} class Tigre extends Animal { public void dormir ( ) {System.out.println ("Sur le dos"); }} class Ours extends Animal { public void dormir ( ) {System.out.println ("Dans les arbres"); }}
public class Essai { public static void main (String args []) {Animal a = new Lion ( ); a.dormir(); a = new Tigre ( ); a.dormir(); a = new Lion ( ); a.dormir(); } }

Le polymorphisme dopration : remarque


Le polymorphisme ninfluence pas lanalyse, mais en dpend : sa mise en uvre efficace repose sur lidentification de mcanismes abstraits, applicables de manire uniforme des objets instances de sous-classes diffrentes. Il ne faut pas penser lanalyse en termes de polymorphisme, mais en terme dabstraction et ainsi, par effet de bord bnfique de celle-ci, rendre possible le polymorphisme.

Exemple 1 sur le transtypage (1)


Animal : {abstrait}
Dormir() {abstrait}

Lion Dormir() Manger()

Tigre Dormir()

Ours Dormir()

Dormir ( ) { Sur le dos } Dormir ( ) { Sur le ventre }

Dormir ( ) { Dans un arbre }

Exemple1 sur le transtypage (2)


Soit Clarance un nom dobjet de type Animal. Nous pouvons donc avoir : Clarance : Lion

Clarance tant une instance de type Lion, nous dsirons faire manger le lion Manger() :Soigneur

Clarance : Lion

Ceci nest pas possible en conception, car lopration manger() nest pas dfinie dans la classe Animal et que Clarance est de type Animal. Or clarance est bien un objet de la classe Lion, il faut donc transformer le type de lobjet clarance.

Exemple1 sur le transtypage (3)


abstract class Animal { abstract public void dormir (); }
class Lion extends Animal { public void dormir () {System.out.println ("Sur le ventre"); } public void manger () {System.out.println ("Le lion mange");}} public class Essai { public static void main (String args []) { Animal clarance = new Lion(); clarance.dormir(); ((Lion)clarance).manger(); } }

Opration de transtypage (cast)

Exemple2 sur le transtypage (1)


Animal Dormir() Dormir ( ) { Un animal dort }

Lion Dormir() Manger()

Tigre Dormir()

Ours Dormir()

Dormir ( ) { Sur le ventre }

Dormir ( ) { Sur le dos }

Dormir ( ) { Dans un arbre }

La mthode Dormir() est ralise dans la classe Animal, elle est donc redfinie dans les classes Lion, Tigre et Ours. On parle de redfinition de mthode.

Exemple2 sur le transtypage (2)


On dsire faire dormir clarance mais en tant que Animal et pas comme un lion.

Dormir en tant que Animal

:soigneur

clarance:Lion

Exemple2 sur le transtypage (3)


class Animal { public void dormir ( ){System.out.println ("Un animal dort");} } class Lion extends Animal { public void dormir ( ) {System.out.println ("Sur le ventre"); } public void manger ( ) {System.out.println ("Le lion mange");}} public class Soigneur { public static void main (String args []) { Animal clarance = new Lion( ); ((Lion)clarance).manger( ); clarance.dormir ( ) ; Utilisation de la mthode dormir() de la classe Lion

((Animal)clarance).dormir( ); }

On indique clarance dutiliser la mthode dormir de la classe Animal

Autre situation o lon exploite le polymorphisme


Point
- CoordonneeX : entier - CoordonneeY : entier <<constructeur>> + Point (X,Y:entier) + <<selecteur>> + affiche() + identifie ()
Point (X,Y : entier) { coordonneX <- X; coordonneY <- Y}

affiche() { identifie(); afficher (" Mes coordonnes sont : " CoordonneX + " " + CoordonneY);} identifie () { Afficher " Je suis un point " }

Pointcolor
- Couleur : entier <<constructeur>> + Pointcolore (Y,Y,Z:entier) + <<selecteur>> + identifie ()

Pointcolor (X,Y,Z : entier) { Point(X,Y) couleur <- Y}

identifie () { Afficher " Je suis un point color de couleur " + couleur }

Traduction en JAVA
class Point { private int coordonneeX, coordonneeY; public Point (int x, int y) { coordonneeX=x;coordonneeY=y;} public void affiche() { identifie(); System.out.println ("Mes coordonnees sont : " + coordonneeX + " " + coordonneeY);} public void identifie() { System.out.println ("Je suis un point ");} }
class Pointcolore extends Point { private int couleur; public Pointcolore (int x, int y, int z) { super(x,y); couleur = z; } public void identifie () { System.out.println ("Je suis un point colore de couleur " + couleur);} } public class essai1 { public static void main (String args []) { Pointcolore pc = new Pointcolore (8,6,2); pc.affiche(); } }

Je suis un point colore de couleur 2 Mes coordonnees sont 8 2

Droulement des appels


- Cration dune instance I1 de la classe PointColor. - Excution du constructeur de la classe PoinColor. -Excution du constructeur de la classe point I1 a pour coordonneeX la valeur 8 I1 a pour coordonneeY la valeur 6 - I1 a pour couleur la valeur 2 - Excution de la mthode affiche de la classe PointColor. Cette mthode est hrite de la classe Point. - Excution de la mthode identifie de la classe PoinColor Affichage je suis un point colore de couleur 2 Affichage Mes coordonnees sont 8 2

Surcharge doprations
Certains langages autorisent lemploi dun mme nom pour dsigner une famille doprations, avec un profil de paramtres diffrent pour chaque opration.

Enfant
Manger() Manger( Lentement : Boolen) Manger (Lentement : Boolen, Comme_un_cochon : boolen)

Surcharge doprations : exemple 1 (1)


Animal Dormir(dure) Dormir ( dure : entier) { Un animal dort pendant dure }

Lion Dormir() Manger()

Tigre Dormir()

Ours Dormir()

Dormir ( ) { Sur le ventre }

Dormir ( ) { Sur le dos }

Dormir ( ) { Dans un arbre }

La mthode Dormir(dure) est hrite. Aussi la mthode Dormir() surcharge (surdfinie) cette dernire.

Surcharge doprations : exemple 1 (2)


class Animal { public void dormir (int duree ) {System.out.println ("Un animal dort" + duree);} } class Lion extends Animal { public void dormir ( ) {System.out.println ("Sur le ventre"); } public void manger ( ) {System.out.println ("Le lion mange");} } class Tigre extends Animal { public void dormir ( ) {System.out.println ("Sur le dos"); }} class Ours extends Animal { public void dormir ( ) {System.out.println ("Dans les arbres"); }} public class Essai { public static void main (String args []) { Lion a = new Lion( ); a.dormir(12); On sait quelle mthode a.dormir( ); dclenche grce aux } paramtres }

Surcharge doprations : exemple 1 (3)


class Animal { public void dormir (int duree ) {System.out.println ("Un animal dort" + duree);} } class Lion extends Animal { public void dormir ( ) {System.out.println ("Sur le ventre"); } public void manger ( ) {System.out.println ("Le lion mange");} } class Tigre extends Animal { public void dormir ( ) {System.out.println ("Sur le dos"); }} class Ours extends Animal { public void dormir ( ) {System.out.println ("Dans les arbres"); }} public class Essai { public static void main (String args []) { Animal a = new Lion( ); Problme de typage et non a.dormir(12); de polymorphisme ((Lion)a).dormir( ) } }

Surcharge doprations : exemple 1 (4)


JAVA est langage typ. Aussi la phase de compilation tient compte des types. La phase dinterprtation ralisera le polymorphisme. Lors de la compilation, le compilateur reconnat la variable a comme tant de type Animal. Lors de linterprtation, cette variable contiendra une instance de la classe Lion. Linstruction a.dormir() nest pas reconnue par le compilateur car dans la dfinition du type Animal, il ny a pas de mthode dormir() et cette mthode nest pas dfinie dans les sur-types de la classe (autrement dit la mthode dormir() nest pas hrite par la classe Animal). Linstruction ((Lion)a).dormir() est reconnue par le compilateur car le type de la variable a est modifi en type Lion qui lui contient la mthode dormir().

Surcharge doprations : exemple 2 (1)


Ami ( Animal a) { cet animal est ami avec un animal}

Animal Ami(Animal)

Lion

Ami(Lion)

Ami (Lion l) { Un lion est ami avec un lion}

Surcharge doprations : exemple 2 (2)


class Animal { public void ami (Animal a) {System.out.println ("Un animal est ami avec un animal");} } class Lion extends Animal { public void ami (Lion l) { System.out.println ("Un lion est ami avec un lion");} } public class Essai { public static void main (String args []) { Animal a = new Lion(); Lion l = new Lion(); l.ami(a); Un animal est ami dun animal } }

Surcharge doprations : exemple 2 (3)


La surcharge est toujours rsolue statiquement par les compilateur. Elle est sans rapport avec la liaison dynamique.
Etude de la ligne : a.ami(l). 1re tape : la compilation - l est reconnu de type Lion - a est reconnu de type Animal mme si elle contient une instance de la classe Lion - On examine donc la mthode ami de la classe animal. Celle-ci doit possder comme argument une variable de type Animal ou de tout sous-type de la classe Animal. l tant de type Lion qui est un sous-type de Animal, le compilateur dcide dutiliser cette mthode et non la mthode ami associ la classe Lion.

Surcharge doprations : exemple 2 (4)


2me tape : linterprtation - la variable a contient une instance de la classe Lion. - la classe Lion possde la mthode ami avec comme argument un Animal, hrite de la classe Animal. - linterprteur excute cette mthode.

La surcharge est toujours rsolue statiquement par les compilateurs.

Exemples en JAVA de conversions des arguments effectifs. (1)


class A { } class B extends A { } Uniquement pour simplifier lexemple class Util { static void f (int p, B b) { } static void f(float x, A a) { } } A a = new A(); B b = new B(); int n; float x; Util.f(n,b); // ok sans conversions : appel de f(int, B) Util.f(x,a); //ok sans conversions : appel de f(float, A) Util.f(n,a); //conversion de n en float : appel de f(float, A) Util.f(x,b); // conversion de b en A : appel de f(float, A)

Exemples en JAVA de conversions des arguments effectifs. (2)


class A { } class B extends A { } class Util { static void f (int p, A a) { } static void f(float x, B b) { } } A a = new A (); B b = new B(); int n; float x; Util.f(n,a); // ok sans conversions : appel de f (int, A) Util.f(x,b); //ok sans conversions : appel de f(float, B) Util.f(n,b); // erreur de compilation car ambigu : deux possibilits : // soit convertir n en float et utiliser f(float, B) // soit convertir b en A et utiliser f(int, A) Util.f(x,a); // erreur de compilation : aucune fonction ne convient // (on ne peut pas convertir implicitement de A en B ni // de float en int)

Limite de lhritage et du polymorphisme


-La classe Point dispose dune mthode identique fournissant la valeur true lorsque le point fourni en argument a les mmes coordonnes que le point courant : Point p1, p2; . p1.identique(p2) // true si p1 et p2 ont mmes coordonnes -La classe Pointcol, drive de Point, redfinit cette mthode pour prendre en compte Non seulement lgalit des coordonnes, mais aussi celle de la couleur : Pointcol pc1, pc2; pc1.identique(pc2) // true si pc1 et pc2 ont mme coordonnes et mme couleur Point p1 = new Pointcol (1,2,(byte)5); Point p2 = new Pointcol (1,2,(byte) 8); p1.identique(p2) true

Vous aimerez peut-être aussi