Vous êtes sur la page 1sur 13

Chapitre 5

Polymorphisme

Hritage et principe de substitution


classe Point getX getY setX setY translate affiche classe PointNomme getX getY setX setY translate affiche (redefini) getNom setNom afficheNom

Hritage un point nomm est un point. Principe de substitution : on peut substituer un objet de type Point un objet de type PointNomme ou n!importe "uel sous#type de Point$

&'emple :

class Graphique{ private Point[] tab ; ... public void ajouterPoint(Point p){ tab[cur]=p ; System.out.println("a out du point!""; p.affiche(); # ... # ... Graphique $=ne% Graphique("; PointNomme pn=ne% Point&omme('()("*""; $.a outerPoint(pn"; ++a,,iche! "a out du point! ('()(*""

# (ranstypage implicite de la rfrence l)objet # *)objet est +u tra+ers une rfrence de type Point # C)est le type rel et non celui de la rfrence$ "ui dtermine la mthode a,,iche utiliser

Transtypage la classe -bject: classe m.re le transtypage:

n)est possible "ue pour deu' classes situes dans la m/me branche dans l)arbre de dri+ation. ne change "ue le type de la rfrence l)objet0 et 1jamais1 le type de l)objet

Transtypage ascendant (upcasting) # implicite en P-- +entuellement e'plicite$ &'emple:


class Graphique{ ... public void a outerPoint(Point p"{...# public Point renvoiePoint-ecent("{...# ... # ... Graphique $=ne% Graphique("; Point&omme pn=ne% Point&omme('()("*""; g.ajouterPoint(pn); Object o=g.renvoiePointRecent();

3utre e'emple:

... Point p=ne% Point( "; Point&omme q=ne% Point&omme("; ... p=q; ++ ou p=(Point"q; ... Point r=new PointNomme(); ...

Appel des mthodes


classe Point getX getY setX setY translate affiche classe PointNomme get4 get5 set4 set5 translate affiche (redefini) getNom setNom afficheNom

&'emple:
Point p6ne7 PointNomme $8 p.translate 10#1$ 99 appel de translate de Point p.affiche $8 99 appel de affiche de PointNomme p.afficheNom $8 99 rejet la compilation ...

R gles gnrales
- *a +isibilit des mthodes est celle du type de la rfrence e': afficheNom$ - C)est le type rel de l)objet et pas celui de la rfrence$ "ui dtermine la mthode appele: # ;i la mthode est redfinie dans la classe dri+e0 c)est cette mthode "ui est appele # ;inon c)est la mthode < la plus proche = "ui est appele

>

Cas particulier:
class 3?...@ class A e'tends 3?...@ class C? .. public static +oid meth 3 '0 A y$8 public static +oid meth A '0 3 y$8 ... @ ... A b10b%8 ... C.meth b10b%$ 99 ambigB0 rejet la compilation ...

!iaison stati"ue #s liaison dynami"ue *e polymorphisme cre des situations oD le type e'act$ de l)objet "ue l)on manipule n)est pas forcment connu au moment de la compilation0 mais seulement l)e'cution. &'emple:
Point tabp['.]=ne% Point['.]; ,or (int i=.;i/'.;i00"{ i, (1ath.random("2..3" tabp[i]=ne% Point("; else tabp[i]=ne% Point&omme("; # ,or (int i=.;i/'.;i00" tabp[i].affiche();

*iaison stati"ue early binding$: le contrEle de type se fait la compilation. *iaison tardi+e9dynami"ue late binding$: le type rel de l)objet n)inter+ient "u)au moment de l)e'cution.

$canisme de liaison dynami"ue &'emple :


... 3 a8 ... a%f( )& ...

3 la compilation: Gecherche dans la classe 3 et +entuellement au# dessus$ une ou plusieurs mthode s$ f candidate s$ m/me profil0 ou profil compatible$.

;)il n)en y a pas: erreur de compilation. Hans certains cas pri+ate9static9final$0 un candidat est choisi liaison stati"ue$. ;inon0 le candidat sera choisi l)e'cution.

3 l)e'cution IJK$: utilisation du type rel de l)objet8 si A hrite de 3 et a pointe sur un objet A0 recherche dans A et +entuellement au#dessus$ de la mthode f in+o"uer. *a IJK tient jour0 pour cha"ue classe0 une table des mthodes des superclasses$ appeler. Lncon+nients: # certaines erreurs de type ne sont dtectes "u)au moment de l)e'cution. # e'cution ralentie du fait de la consultation systmati"ue de la table des mthodes.
1M

$odificateur 'inal # appli"u une classe: permet d)emp/cher de dri+er de nou+elles classes. ;ynta'e: final class C? .... @ &'emple: la classe ;tring est final # appli"ue une mthode: permet d)emp/cher "ue la mthode soit redfinie dans une sous#classe class C? ... public final f ...$?...@ ... @ (outes les methodes d)une classe final sont implicitement final. Lntr/t: # scurit pas de liaison dynami"ue remar"ue: dans ce cas le compilateur peut +entuellement remplacer l)appel de la mthode par le code m/me de la mthode$.

11

Transtypage descendant (do(ncasting) le transtypage descendant doit /tre e'plicite. &'emple:


class 3?...@ class A e'tends 3?...@ ... 3 a6...8 A b6... b)(*)a&

ContrEle: la compilation l)e'cution: si le type rel de a n)est pas de la classe A0 e'ception le+e et arr/t du programme si elle n)est pas traite$ -n peut utiliser la G((L identification de type l)e'cution$: if a instanceof A$ ? b6 A$a8 @ ne pas en abuser$. 3ttention la smanti"ue de instanceof comparer a+ec getClass$. Lntr/t: permet d)accder au' mthodes spcifi"ues de la sous#classe "ue penser d)une telle situation N$ programmation gnri"ue0 mthodes "ui ren+oient des rfrences des objets de la classe -bject0 "u)il faut ensuite transtyper.
1%

Tirer profit du polymorphisme

Gutilisation de code e'istant Otiliser des rfrences du type le plus abstrait possible sauf pour les +aleurs de retour des mthodes$ *imiter l)usage du do7ncasting et de la rfle'ion. Penser en termes d)architecture de classes Conce+oir une architecture de classes facilitant l)abstraction &'emple: partir de deu' classes A1et A% similaires : - conce+oir une super#classe 3 "ui regroupe l)interface commune de A1 et A% - utiliser des rfrences de type 3.

1,