Professional Documents
Culture Documents
Polymorphisme
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
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
3utre e'emple:
... Point p=ne% Point( "; Point&omme q=ne% Point&omme("; ... p=q; ++ ou p=(Point"q; ... Point r=new PointNomme(); ...
&'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.
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
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%
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,