Polymorphisme

1/1
100%

Polymorphisme

Objectifs sp cifiques :

1. Comprendre le concept de polymorphisme

2. Int grer la notion de surclassement (upcasting) et de ligature dynamique

3. Saisir la notion de conversion explicite

El ments de contenu :

  • Concept de polymorphisme
  • Surclassement (upcasting)
  • Ligature dynamique.
  • Conversion explicite (Downcasting)
  • Conversion des arguments effectifs

Volume horaire : 3h00

| | |

| --- | --- |

| ![](data:image/png;base64...) | ![](data:image/png;base64...) |

1. Concept de polymorphisme

  • Le terme polymorphisme d crit la caract ristique d'un l ment qui peut prendre plusieurs formes.
  • "Le polymorphisme constitue la troisi me caract ristique essentielle d'un langage orient objet apr s l'abstraction des donn es (encapsulation) et l'h ritage"[[1]](#footnote-1). Cest un concept extr mement puissant en POO qui permet de manipuler des objets sans en conna tre tout fait le type tout en se basant sur la relation dh ritage.
  • Le polymorphisme en Java, se traduit par :

+ Le surclassement : La compatibilit ascendante entre un type d riv e et un type ascendant.

+ La ligature dynamique des m thodes, dans le sens o il permet dobtenir le comportement adapt chaque type dobjet, sans avoir besoin de tester sa nature de quelque fa on que ce soit.

| | |

| --- | --- |

| ![](data:image/png;base64...) | ![](data:image/png;base64...) |

  • La notion de polymorphisme peut tre g n ralis e dans le cas de d rivations successives.
  • Le polymorphisme se base sur cette affirmation : un objet a comme type non seulement sa classe mais aussi nimporte quelle classe d riv e.
  • si dans le m me contexte dh ritage, on a la fois une red finition et une surcharge de la m me m thode, les r gles de polymorphisme deviennent de plus en plus compliqu es.

1. Surclassement (upcasting)

  • Une classe B qui h rite de la classe A peut tre vue comme un sous-type (sous ensemble) du type d fini par la classe A.
  • Tout objet instance de la classe B peut tre aussi vu comme une instance de la classe A.
  • Cette relation est directement support e par le langage JAVA :

+ une r f rence d clar e de type A il est possible d'affecter une valeur qui est une r f rence vers un objet de type B (surclassement ou upcasting)

class A {

void m1(){ System.out.println("Objet de classe A");}

}

class B extends A {

void m2(){ System.out.println("Objet de classe B");}

}

On pourrait tout fait crire le code suivant dans la classe Test

A a = new B();

a.m1();//affiche objet de classe A

A travers ce court exemple vous avez vu le premier concept du polymorphisme : la compatibilit ascendante. En effet, vous avez manipul un objet de type A via une r f rence de type B. A tant la classe m re de B.

Exemple

| | |

| --- | --- |

| ![](data:image/png;base64...) | EtudiantSportif est un Etudiant. Lensemble des tudiants sportifs est inclus dans lensemble des tudiants. Etudiant e ; e=new EtudiantSportif(&) ; |

  • + Plus g n ralement une r f rence d'un type donn , il est possible d'affecter une valeur qui correspond une r f rence vers un objet dont le type effectif est n'importe quelle sous-classe directe ou indirecte du type de la r f rence.

![](data:image/png;base64...)

  • Lorsqu'un objet est "sur-class " il est vu comme un objet du type de la r f rence utilis e pour le d signer

+ Ses fonctionnalit s sont alors restreintes celles propos es par la

classe du type de la r f rence

class A {

void m1(){ System.out.println("Objet de classe A");}

}

class B extends A {

void m2(){ System.out.println("Objet de classe B");}

}

A a = new B();

Publicité

a.m1();

a.m2();//faux car le type de r f rence de l'objet a est la classe A. Donc l'objet a n'a pas acc s la m thode m2 de la classe B

Exemple

![](data:image/png;base64...)

EtudiantSportif es;

es = new EtudiantSportif("DUPONT","Jean",25,"Badminton");

Etudiant e;

e = es; // surclassement (upcasting)

es.bonusSportif();

e.bonusSportif();//Faux car il y a restriction, e na acc s quaux m thodes de la classe Etudiant.

1. Ligature dynamique

  • Dans le chapitre portant sur lh ritage nous avons pr sent les concepts de red finition de m thodes. La prise en compte du polymorphisme va compliquer la red finition.
  • Les messages sont r solus lex cution

+ la m thode ex cut e est d termin e l'ex cution (run-time) et non pas la compilation

+ cet instant le type exact de l'objet qui re oit le message est connu

  • la m thode d finie pour le type r el de lobjet recevant le message est appel e (et non pas celle d finie pour son type d clar ).
  • Ce m canisme est d sign sous le terme de lien-dynamique (dynamic binding, latebinding ou run-time binding)

![](data:image/png;base64...)

Exemple :

public class Etudiant {

String nom, pr nom;

int age;

public Etudiant(String nom, String pr nom, int age) {

super();

this.nom = nom;

this.pr nom = pr nom;

this.age = age;

}

public void affiche(){System.out.println("je suis tudiant");}

}

public class EtudiantSportif extends Etudiant{

String sport;

public EtudiantSportif(String nom, String pr nom, int age, String sp) {

super(nom, pr nom, age);

sport=sp;

// TODO Auto-generated constructor stub

}

public void affiche(){

super.affiche();

System.out.println("je suis sportif, je pratique le "+this.sport);

}

}

&

Etudiant e=new EtudiantSportif("Somrani","Mohamed",20,"foot");

e.affiche();//Quel est le r sultat ??

Que va afficher lappel la m thode affiche de lobjet e : la m thode affiche() de la classe Etudiant ou celle de la classe EtudiantSportif

Ex cution

je suis tudiant

je suis sportif, je pratique le foot

| | |

Publicité

| --- | --- |

| ! (data:image/gif;base64...) | Lorsquune m thode dun objet est acc d e au travers dune r f rence surclass e , cest la m thode telle quelle est d finie au niveau de la classe effective de lobjet qui est en fait invoqu e et ex cut e. |

1. Application du polymorphisme

//Classe de base

class graphique {

private int x, y;

public graphique ( int x, int y) { this.x = x ; this.y = y ;}

public void identifie () {

System.out.println ("Je suis une forme g ometrique") ;}

public void affiche () {

this.identifie() ;

System.out.println ("Le centre de lobjet se trouve dans :" + x + "et" + y) ;}

double surface () {return (0) ;}

} // fin de la classe graphique

//Classe d riv e1

class Cercle extends graphique {

private double rayon =1 ;

public Cercle ( int x, int y, double r) {super(x,y) ;rayon = r ;}

public void identifie () {

System.out.println ("Je suis un cercle");}

double surface (){

return ( rayon \ rayon \ 3.14) ;} }

//Classe d riv e2

class Rectangle extends graphique {

private int larg, longueur ;

Rectangle ( int x, int y, int l1, int l2){

super (x,y) ;

longueur = l1 ; larg = l2 ;}

double surface () {return (longueur\*larg) ;}

public void identifie() {

System.out.println("Je suis un rectangle ") ;}

}// fin de la classe Rectangle

//Classe de test

class test\_poly {

public static void main (String [] args) {

graphique g = new graphique (3,7);

g.identifie ();

g= new Cercle (4,8,10) ;

//compatibilit entre le type de la classe et de la classe d riv

g.identifie() ;

g= new Rectangle (7,9,10,3) ;

//compatibilit entre le type de la classe et de la classe d riv

g.identifie () ;

}

}

R sultat de lex cution

Je suis une forme g ometrique

Je suis un cercle

Publicité

Je suis un rectangle

Interpr tation

Le m me identificateur g est initialis dans la 1 re instruction avec une r f rence de type graphique , puis on a chang la r f rence de cette variable dans linstruction3 en lui affectant une r f rence de type Cercle , puis dans linstruction 5, on a chang sa r f rence avec une r f rence de classe d riv e Rectangle .

Ces affectations confirment la compatibilit entre un type dune classe de base et la r f rence dune classe d riv e.

Lautre point qui semble plus important cest la ligature dynamique des m thodes, dans le sens o le r sultat de la m thode identifie a chang dans chaque appel selon le type effectif de la variable g .

Exemple 2 : Tableau des objets

Dans cet exemple, on va exploiter les possibilit s de polymorphisme pour cr er un tableau h t rog ne dobjets, cest dire dans lequel les l ments peuvent tre de types diff rents.

class test\_poly2 {

public static void main (String [] args) {

graphique [] tab = new graphique [6];

tab[0] = new graphique (3,2);

tab[1] = new Cercle (10,7,3) ;

tab [2] = new Rectangle (4,7,8,6) ;

tab [3] = new graphique (8,10);

tab[4] = new Cercle (8,5,3) ;

tab[5] = new Rectangle (10,17,3,8) ;

for (i=0 ; i <=5 ; i++) {

tab .identifie();}

}

}

R sultat de lex cution

Je suis une forme g om trique Le centre de l'objet se trouve dans : 3 et 2

Je suis un cercle Le centre de l'objet se trouve dans : 10 et 7

Je suis un rectangle Le centre de l'objet se trouve dans : 4 et 7

Je suis une forme g om trique Le centre de l'objet se trouve dans : 8 et 10

Exemple 3 :

class test\_poly3 {

public static void main (String [] args) {

graphique d;

int c= Integer.parseInt(args [0]) ;

switch (c) {

case 0 : d=new Cercle (10,10,10) ; break;

case 1 : d=new Rectangle (10,10,10,10) ; break;

case 2 : d= new graphique (10,10); break;

default: d= new graphique (0,0);

}

d.identifie () ;

System.out.println ("Surface ="+ d.surface()) ;

}}

R sultat de lex cution :

Le message affich est en fonction de largument introduit dans la commande dex cution.

1. Conversion des arguments effectifs

Exemple 1 :

class A{

public void identifie() {

System.out.println ("Objet de type A") ; }

}

class B extends A{

Publicité

// pas de red finition de identifie ici

}

class T{

static void f(A a ) {

a.identifie(); }

}

&..

A a = new A();

B b = new B ();

T.f(a); // OK Appel usuel; il affiche objet de type A

T.f(b) ; /\OK une r f rence un objet de type B est compatible avec une r f rence un objet de type A. Lappel a.identifie() affiche : Objet de type A \/

Exemple 2 :

On va juste modifier le corps de la classe B par une red finition de la m thode identifie

class B {

public void identifie () {

System.out.println ( Objet de type B ) ;}

}

A a = new A(); B b = new B ();

T.f (b) ;

/\OK une r f rence un objet de type B est compatible avec une r f rence un objet de type A. Lappel a.identifie() affiche : Objet de type B \/

Cet exemple, montre que comme dans les situations daffectation, la conversion implicite dun type d riv dans un type de base nest pas d gradante puisque gr ce au polymorphisme, cest bien le type de lobjet r f renc qui intervient.

Remarque :

Dans le cas o la m thode f est surdefinie, il y a encore des r gles plus compliqu es lors de la conversion implicite des types de param tres.

1. Conversions explicites (downcasting)

Compatibilit entre r f rence un objet dun type donn et une r f rence un objet dun type ascendant. Dans le sens inverse, la compatibilit nest pas implicite.

Exemple :

class graphique {&&.}

class Cercle {&&..}

&..

graphique g,g1 ;

Cercle c,c1 ;

C = new graphique (&.) ; //Erreur de compilation

g= new Cercle (&) //Juste

g1 = new graphique (&.) ; // vident

c1= new Cercle(&) ; // vident

c1 = g1 //faux (Conversion implicite ill gale)

g1= c1 ; //juste ; (conversion implicite l gale)

Il faut r aliser une conversion explicite c1 = (Cercle) g1 ;

Toutefois cette syntaxe qui est accept e la compilation peut tre refus e lex cution et le traitement peut tre arr t e si il n y a pas compatibilit effective entre les types.

Exercice : Upcasting/Downcasting

![](data:image/png;base64...)

![](data:image/png;base64...)

1. Bruce Eckel "Thinking in JAVA" [ ](#footnote-ref-1)

Polymorphisme

Programmation Orientée Objet (POO) · course

Browse all programmation documents

Polymorphisme

Objectifs sp cifiques :

1. Comprendre le concept de polymorphisme

2. Int grer la notion de surclassement (upcasting) et de ligature dynamique

3. Saisir la notion de conversion explicite

El ments de contenu :

  • Concept de polymorphisme
  • Surclassement (upcasting)
  • Ligature dynamique.
  • Conversion explicite (Downcasting)
  • Conversion des arguments effectifs

Volume horaire : 3h00

| | |

| --- | --- |

| ![](data:image/png;base64...) | ![](data:image/png;base64...) |

1. Concept de polymorphisme

  • Le terme polymorphisme d crit la caract ristique d'un l ment qui peut prendre plusieurs formes.
  • "Le polymorphisme constitue la troisi me caract ristique essentielle d'un langage orient objet apr s l'abstraction des donn es (encapsulation) et l'h ritage"[[1]](#footnote-1). Cest un concept extr mement puissant en POO qui permet de manipuler des objets sans en conna tre tout fait le type tout en se basant sur la relation dh ritage.
  • Le polymorphisme en Java, se traduit par :

+ Le surclassement : La compatibilit ascendante entre un type d riv e et un type ascendant.

+ La ligature dynamique des m thodes, dans le sens o il permet dobtenir le comportement adapt chaque type dobjet, sans avoir besoin de tester sa nature de quelque fa on que ce soit.

| | |

| --- | --- |

| ![](data:image/png;base64...) | ![](data:image/png;base64...) |

  • La notion de polymorphisme peut tre g n ralis e dans le cas de d rivations successives.
  • Le polymorphisme se base sur cette affirmation : un objet a comme type non seulement sa classe mais aussi nimporte quelle classe d riv e.
  • si dans le m me contexte dh ritage, on a la fois une red finition et une surcharge de la m me m thode, les r gles de polymorphisme deviennent de plus en plus compliqu es.

1. Surclassement (upcasting)

  • Une classe B qui h rite de la classe A peut tre vue comme un sous-type (sous ensemble) du type d fini par la classe A.
  • Tout objet instance de la classe B peut tre aussi vu comme une instance de la classe A.
  • Cette relation est directement support e par le langage JAVA :

+ une r f rence d clar e de type A il est possible d'affecter une valeur qui est une r f rence vers un objet de type B (surclassement ou upcasting)

class A {

void m1(){ System.out.println("Objet de classe A");}

}

class B extends A {

void m2(){ System.out.println("Objet de classe B");}

}

On pourrait tout fait crire le code suivant dans la classe Test

A a = new B();

a.m1();//affiche objet de classe A

A travers ce court exemple vous avez vu le premier concept du polymorphisme : la compatibilit ascendante. En effet, vous avez manipul un objet de type A via une r f rence de type B. A tant la classe m re de B.

Exemple

| | |

| --- | --- |

| ![](data:image/png;base64...) | EtudiantSportif est un Etudiant. Lensemble des tudiants sportifs est inclus dans lensemble des tudiants. Etudiant e ; e=new EtudiantSportif(&) ; |

  • + Plus g n ralement une r f rence d'un type donn , il est possible d'affecter une valeur qui correspond une r f rence vers un objet dont le type effectif est n'importe quelle sous-classe directe ou indirecte du type de la r f rence.

![](data:image/png;base64...)

  • Lorsqu'un objet est "sur-class " il est vu comme un objet du type de la r f rence utilis e pour le d signer

+ Ses fonctionnalit s sont alors restreintes celles propos es par la

classe du type de la r f rence

class A {

void m1(){ System.out.println("Objet de classe A");}

}

class B extends A {

void m2(){ System.out.println("Objet de classe B");}

}

A a = new B();

Advertisement

a.m1();

a.m2();//faux car le type de r f rence de l'objet a est la classe A. Donc l'objet a n'a pas acc s la m thode m2 de la classe B

Exemple

![](data:image/png;base64...)

EtudiantSportif es;

es = new EtudiantSportif("DUPONT","Jean",25,"Badminton");

Etudiant e;

e = es; // surclassement (upcasting)

es.bonusSportif();

e.bonusSportif();//Faux car il y a restriction, e na acc s quaux m thodes de la classe Etudiant.

1. Ligature dynamique

  • Dans le chapitre portant sur lh ritage nous avons pr sent les concepts de red finition de m thodes. La prise en compte du polymorphisme va compliquer la red finition.
  • Les messages sont r solus lex cution

+ la m thode ex cut e est d termin e l'ex cution (run-time) et non pas la compilation

+ cet instant le type exact de l'objet qui re oit le message est connu

  • la m thode d finie pour le type r el de lobjet recevant le message est appel e (et non pas celle d finie pour son type d clar ).
  • Ce m canisme est d sign sous le terme de lien-dynamique (dynamic binding, latebinding ou run-time binding)

![](data:image/png;base64...)

Exemple :

public class Etudiant {

String nom, pr nom;

int age;

public Etudiant(String nom, String pr nom, int age) {

super();

this.nom = nom;

this.pr nom = pr nom;

this.age = age;

}

public void affiche(){System.out.println("je suis tudiant");}

}

public class EtudiantSportif extends Etudiant{

String sport;

public EtudiantSportif(String nom, String pr nom, int age, String sp) {

super(nom, pr nom, age);

sport=sp;

// TODO Auto-generated constructor stub

}

public void affiche(){

super.affiche();

System.out.println("je suis sportif, je pratique le "+this.sport);

}

}

&

Etudiant e=new EtudiantSportif("Somrani","Mohamed",20,"foot");

e.affiche();//Quel est le r sultat ??

Que va afficher lappel la m thode affiche de lobjet e : la m thode affiche() de la classe Etudiant ou celle de la classe EtudiantSportif

Ex cution

je suis tudiant

je suis sportif, je pratique le foot

| | |

Advertisement

| --- | --- |

| ! (data:image/gif;base64...) | Lorsquune m thode dun objet est acc d e au travers dune r f rence surclass e , cest la m thode telle quelle est d finie au niveau de la classe effective de lobjet qui est en fait invoqu e et ex cut e. |

1. Application du polymorphisme

//Classe de base

class graphique {

private int x, y;

public graphique ( int x, int y) { this.x = x ; this.y = y ;}

public void identifie () {

System.out.println ("Je suis une forme g ometrique") ;}

public void affiche () {

this.identifie() ;

System.out.println ("Le centre de lobjet se trouve dans :" + x + "et" + y) ;}

double surface () {return (0) ;}

} // fin de la classe graphique

//Classe d riv e1

class Cercle extends graphique {

private double rayon =1 ;

public Cercle ( int x, int y, double r) {super(x,y) ;rayon = r ;}

public void identifie () {

System.out.println ("Je suis un cercle");}

double surface (){

return ( rayon \ rayon \ 3.14) ;} }

//Classe d riv e2

class Rectangle extends graphique {

private int larg, longueur ;

Rectangle ( int x, int y, int l1, int l2){

super (x,y) ;

longueur = l1 ; larg = l2 ;}

double surface () {return (longueur\*larg) ;}

public void identifie() {

System.out.println("Je suis un rectangle ") ;}

}// fin de la classe Rectangle

//Classe de test

class test\_poly {

public static void main (String [] args) {

graphique g = new graphique (3,7);

g.identifie ();

g= new Cercle (4,8,10) ;

//compatibilit entre le type de la classe et de la classe d riv

g.identifie() ;

g= new Rectangle (7,9,10,3) ;

//compatibilit entre le type de la classe et de la classe d riv

g.identifie () ;

}

}

R sultat de lex cution

Je suis une forme g ometrique

Je suis un cercle

Advertisement

Je suis un rectangle

Interpr tation

Le m me identificateur g est initialis dans la 1 re instruction avec une r f rence de type graphique , puis on a chang la r f rence de cette variable dans linstruction3 en lui affectant une r f rence de type Cercle , puis dans linstruction 5, on a chang sa r f rence avec une r f rence de classe d riv e Rectangle .

Ces affectations confirment la compatibilit entre un type dune classe de base et la r f rence dune classe d riv e.

Lautre point qui semble plus important cest la ligature dynamique des m thodes, dans le sens o le r sultat de la m thode identifie a chang dans chaque appel selon le type effectif de la variable g .

Exemple 2 : Tableau des objets

Dans cet exemple, on va exploiter les possibilit s de polymorphisme pour cr er un tableau h t rog ne dobjets, cest dire dans lequel les l ments peuvent tre de types diff rents.

class test\_poly2 {

public static void main (String [] args) {

graphique [] tab = new graphique [6];

tab[0] = new graphique (3,2);

tab[1] = new Cercle (10,7,3) ;

tab [2] = new Rectangle (4,7,8,6) ;

tab [3] = new graphique (8,10);

tab[4] = new Cercle (8,5,3) ;

tab[5] = new Rectangle (10,17,3,8) ;

for (i=0 ; i <=5 ; i++) {

tab .identifie();}

}

}

R sultat de lex cution

Je suis une forme g om trique Le centre de l'objet se trouve dans : 3 et 2

Je suis un cercle Le centre de l'objet se trouve dans : 10 et 7

Je suis un rectangle Le centre de l'objet se trouve dans : 4 et 7

Je suis une forme g om trique Le centre de l'objet se trouve dans : 8 et 10

Exemple 3 :

class test\_poly3 {

public static void main (String [] args) {

graphique d;

int c= Integer.parseInt(args [0]) ;

switch (c) {

case 0 : d=new Cercle (10,10,10) ; break;

case 1 : d=new Rectangle (10,10,10,10) ; break;

case 2 : d= new graphique (10,10); break;

default: d= new graphique (0,0);

}

d.identifie () ;

System.out.println ("Surface ="+ d.surface()) ;

}}

R sultat de lex cution :

Le message affich est en fonction de largument introduit dans la commande dex cution.

1. Conversion des arguments effectifs

Exemple 1 :

class A{

public void identifie() {

System.out.println ("Objet de type A") ; }

}

class B extends A{

Advertisement

// pas de red finition de identifie ici

}

class T{

static void f(A a ) {

a.identifie(); }

}

&..

A a = new A();

B b = new B ();

T.f(a); // OK Appel usuel; il affiche objet de type A

T.f(b) ; /\OK une r f rence un objet de type B est compatible avec une r f rence un objet de type A. Lappel a.identifie() affiche : Objet de type A \/

Exemple 2 :

On va juste modifier le corps de la classe B par une red finition de la m thode identifie

class B {

public void identifie () {

System.out.println ( Objet de type B ) ;}

}

A a = new A(); B b = new B ();

T.f (b) ;

/\OK une r f rence un objet de type B est compatible avec une r f rence un objet de type A. Lappel a.identifie() affiche : Objet de type B \/

Cet exemple, montre que comme dans les situations daffectation, la conversion implicite dun type d riv dans un type de base nest pas d gradante puisque gr ce au polymorphisme, cest bien le type de lobjet r f renc qui intervient.

Remarque :

Dans le cas o la m thode f est surdefinie, il y a encore des r gles plus compliqu es lors de la conversion implicite des types de param tres.

1. Conversions explicites (downcasting)

Compatibilit entre r f rence un objet dun type donn et une r f rence un objet dun type ascendant. Dans le sens inverse, la compatibilit nest pas implicite.

Exemple :

class graphique {&&.}

class Cercle {&&..}

&..

graphique g,g1 ;

Cercle c,c1 ;

C = new graphique (&.) ; //Erreur de compilation

g= new Cercle (&) //Juste

g1 = new graphique (&.) ; // vident

c1= new Cercle(&) ; // vident

c1 = g1 //faux (Conversion implicite ill gale)

g1= c1 ; //juste ; (conversion implicite l gale)

Il faut r aliser une conversion explicite c1 = (Cercle) g1 ;

Toutefois cette syntaxe qui est accept e la compilation peut tre refus e lex cution et le traitement peut tre arr t e si il n y a pas compatibilit effective entre les types.

Exercice : Upcasting/Downcasting

![](data:image/png;base64...)

![](data:image/png;base64...)

1. Bruce Eckel "Thinking in JAVA" [ ](#footnote-ref-1)