• Aucun résultat trouvé

Polymorphisme Polymorphisme

N/A
N/A
Protected

Academic year: 2022

Partager "Polymorphisme Polymorphisme"

Copied!
4
0
0

Texte intégral

(1)

Polymorphisme Polymorphisme

Karima Boudaoud Karima Boudaoud

IUT-R&T IUT-R&T

Richard Grin Univ.

Nice Sophia Antipolis

Karima Boudaoud IUT GTR - Sophia Antipolis

2

Polymorphisme (1) Polymorphisme (1)

Question

Reprenons l’exemple de la classe Etudiant qui hérite de la classe Personne. Soit une méthode

getNom() de Personne qui est redéfinie dans Etudiant

quelle méthode getNom() sera exécutée dans le code suivant, celle de Personne ou celle de Etudiant?

Personne a =new Etudiant(5); // a est un objet de la classe a.getNom(); Etudiant mais il est

déclaré de la classe

Personne

la méthode appelée ne dépend que du type réel (Etudiant) de l’objet a et pas du type déclaré (ici Personne )

c’est la méthode de la classe Etudiant qui sera exécutée

Peter Sander ESSI-Université de Nice Sophia Antipolis

3

Polymorphisme (2) Polymorphisme (2)

NomComplet peut être utilisé à la place de Nom

Peter Sander ESSI-Université de Nice Sophia Antipolis

4

Exemple (1) Exemple (1)

Nom[] noms = new Nom[4];

noms[0] = new NomComplet("Cantonna",

"Eric");

noms[1] = new Nom("Ronaldo");

noms[2] = new NomComplet("Overmars",

"Marc");

...

for (int i = 0; i < 4; i++) {

System.out.println(noms[i].getNom());

}

-> Eric Cantonna Ronaldo

Marc Overmars

Classe dérivée à la place de la classe

Quelle méthode ?

(2)

Peter Sander ESSI-Université de Nice Sophia Antipolis

5

Exemple (2) Exemple (2)

for (int i = 0; i < 4; i++) {

System.out.println(noms[i].getNom());

}

0 1 2 3 noms

NomComplet getNom()

NomComplet getNom()

NomComplet getNom()

Nom getNom()

Peter Sander ESSI-Université de Nice Sophia Antipolis

6

Polymorphisme Polymorphisme

même code d’invocation de getNom()

toujours sur un objet déclaré de type Nom

System.out.println(noms[i].getNom());

appliqué aux objets de types différents…

on a un effet différent selon le constructeur appelé

new NomComplet(…) ou new Nom(…)

Peter Sander ESSI-Université de Nice Sophia Antipolis

7

Autre exemple (1) Autre exemple (1)

Peter Sander ESSI-Université de Nice Sophia Antipolis

8

Autre exemple (2) Autre exemple (2)

public class Polymorph { void prnt() {

System.out.println("poly");

} }

public class MonomorphA extends Polymorph { void prnt() {

System.out.println("type A");

} }

public class MonomorphB extends Polymorph { void prnt() {

System.out.println("type B");

} }

(3)

Peter Sander ESSI-Université de Nice Sophia Antipolis

9

Autre exemple (3) Autre exemple (3)

...

Polymorph pm = new Polymorph();

pm.prnt();

pm = new MonomorphA();

pm.prnt();

pm = new MonomorphB();

pm.prnt();

// Poly à la place de Poly

// MonoA à la place de Poly

// MonoB à la place de Poly -> poly

type A type B

Peter Sander ESSI-Université de Nice Sophia Antipolis

10

Polymorphisme (1) Polymorphisme (1)

Polymorph prnt()

MonomorphA prnt()

MonomorphB prnt() Polymorph

pm

Peter Sander ESSI-Université de Nice Sophia Antipolis

11

Polymorphisme (2) Polymorphisme (2)

UpcastingUpcasting

faire passer une classe dérivée pour sa super- classe

sans risque

• toute méthode de la super-classe est aussi une méthode de la classe dérivée (par définition)

Upcast

Peter Sander ESSI-Université de Nice Sophia Antipolis

12

Polymorphisme (3) Polymorphisme (3)

Comment déterminer la méthode appropriée

?

pendant la compilation

le compilateur se base sur le type déclaré

exemple

Polymorph pm;

pendant l’exécution

la JVM se base sur le type réel de l’objet qui reçoit l’invocation

exemple

pm = new MonomorphA();

c’est le "late binding » (liaison retardée)

"dynamic binding" (liaison dynamique)

(4)

Peter Sander ESSI-Université de Nice Sophia Antipolis

13

Polymorphisme (4) Polymorphisme (4)

Downcasting

faire passer une super-classe pour une classe dérivée

pas sans risque

la classe dérivée étend la super-classe

peut avoir des méthodes que la super-classe n’a pas

Downcast

Peter Sander ESSI-Université de Nice Sophia Antipolis

14

Polymorphisme (5) Polymorphisme (5)

public class Velo extends Vehicule { ...

public void pedaler(...) {...}

} ...

Velo unVelo = new Vehicule(); // ne compile pas

Velo unVelo = (Velo) new Vehicule();

unVelo.pedaler(); // méthode n’existe pas

Downcast provoque ClassCastException à l’exécution

Références

Documents relatifs

On parle de polymorphisme génétique à un locus lorsqu’il existe dans la population deux allèles au moins à ce locus, avec comme condition, dans le cas le

de la méthode d'expression libre dans une classe à tous les. Naturellement il ne saurait être question de éparer cet. apprentissage de la lecture de celui de

En perspectives à ce travail, il serait plus judicieux d’élargir davantage la taille de l’échantillon par réalisation d’une enquête épidémiologique à très

Une méthode abstraite est une méthode dont la signature et le type de la valeur de retour sont fournis dans la classe et rien d'autre (pas le corps de la méthode

quelle méthode getNom() sera exécutée dans le code suivant, celle de Personne ou celle de Etudiant.. Personne a =new Etudiant(5); // a est un objet de la classe a.getNom();

Héritage simple : classe dérivée n’a qu’une seule classe de base Héritage multiple : classe dérivée a plus d’une classe de base.

De plus, une interface contient souvent ses méthodes abstraites qui présentent certaines comportements assez générales ( hasMoreElements() : avoir encore

6- Ecrire la méthode void avancerAvecConflit(int n, Pion pio), qui fait la même chose que la méthodes avancer de la classe Pion et qui prend compte de cette modification (la