Comprendre les hiérarchies de types: le polymorphisme en Java Virginia Aponte CNAM-Paris 14 mars 2016 VirginiaAponte (CNAM-Paris) NFA035 14mars2016 1/1 Polymorphisme = plusieurs formes (pour les types) Idée L’argumentpasséàuneméthodepeutavoirplusd’untype,sil’algorithme implantéparlaméthodenedépendpas(demanièretropforte)decetype. Exemples: laméthodeaddquiajouteunobjetenfindeliste,n’utilisepasde connaissanceliéeautypedel’objetajouté. laméthodequiafficheunobjetdetypeAffichable,nedépendpasdu typeprécisdel’objet,maisseulementdufaitqu’ilpossèdeuneméthode afficher; VirginiaAponte (CNAM-Paris) NFA035 14mars2016 2/1 2 sortes de polymorphisme Polymorphismeparamétrique(ougénéricité):méthode«paramétrée» paruntypegénériqueT; Ex:add(T e)pourlesArrayList<T>. Polymorphismeparsous-typage:laméthodeestapplicablesurtout type«plusbas»dansunehiérarchiedetypes. Ex:laméthodeaff(Affichable a)applicablesurtoutobjetqui implanteAffichable. VirginiaAponte (CNAM-Paris) NFA035 14mars2016 3/1 Hiérarchies de types en Java (classes + interfaces) EnJava,lestypes(classes+interfaces)sontorganiséesenhiérarchies. SiBestun«descendant»deAdansunemêmehiérarchie⇒Bcontientau moins toutesleméthodesdeA,pluséventuellementd’autres. Notation:A(cid:57)(cid:57)(cid:75)B siginifieB descendantdeA. I (cid:57)(cid:57)(cid:75)C :entreinterfacesetclassesviaimplements:siuneclasseC implanteuneinterfaceI; I (cid:57)(cid:57)(cid:75)I :entreinterfacesviaextends,siuneinterfaceI étendune 1 2 2 autreinterfaceI ; 1 C (cid:57)(cid:57)(cid:75)C :entreclassesviaextends,siuneclasseC étendune 1 2 2 autreclasseC ; 1 VirginiaAponte (CNAM-Paris) NFA035 14mars2016 4/1 Exemple : hiérarchie entre interfaces et classes Interface interface Affichable { void afficher(); Affichable } implements class Compte implements Affichable { … public void afficher() { …} } Compte Date class Date implements Affichable { Classes …. public void afficher() { …} } VirginiaAponte (CNAM-Paris) NFA035 14mars2016 5/1 Exemple de polymorphisme par sous-typage (1) static void aff(String m, Affichable a){ Terminal.ecrireString(m); a.afficher(); } public static void main(...){ Compte c = new Compte(); Date drv = new Date(); aff("Etat du compte", c); aff("Date du rdv", d); affaccepteaussibienunobjetComptequ’unobjetDate. affestpolymorpheparsous-typage:elleacceptetoutobjetdontletypeest undescendantdutypeAffichabledéclarépoursonargumenta. VirginiaAponte (CNAM-Paris) NFA035 14mars2016 6/1 Exemple : hiérarchie entre classes (1) CompteRemunereétendlaclasseCompteavecnouveuxattributs+ méthodes. class CompteRemunere extends Compte { double taux; ... void fixeTaux(double t) { this.taux = t;} void crediterInterets() { ...} } UnobjetCompteRemunerecontientattributs+méthodesdesaclasseplus ceuxdelaclasseCompte. CompteRemunerehéritedetouteslesméthodesetattributsdeCompte. VirginiaAponte (CNAM-Paris) NFA035 14mars2016 7/1 Exemple : hiérarchie entre classes (2) Classes class CompteRemunere extends Compte { Compte double taux; void fixeTaux(double t){…} extends void crediterInterets(){…} } CompteRemunere VirginiaAponte (CNAM-Paris) NFA035 14mars2016 8/1 Exemple de polymorphisme par sous-typage (2) public static void main(...){ Compte c = new Compte(); CompteRemunerere cr = new CompteRemunere(); cr.depot(20); c.depot(50); depots’appliqueaussibiensurunComptequesurunCompteRemunere. depotestpolymorpheparsous-typage:elles’appliquesurtoutobjet descendantdutypeCompte. VirginiaAponte (CNAM-Paris) NFA035 14mars2016 9/1 Exemple de polymorphisme par sous-typage (3) static double somme(Compte c1, Compte c2){ return (c1.getSolde() + c2.getSolde()); } public static void main(...){ Compte c = new Compte(); CompteRemunerere cr = new CompteRemunere(); double s1 = somme(c,cr); double s2 = somme(cr, cr); sommeaccepteaussibiendesComptequedesCompteRemunere. sommeestpolymorpheparsous-typage:elleacceptetoutobjetdescendant dutypeComptedéclarépoursesarguments. VirginiaAponte (CNAM-Paris) NFA035 14mars2016 10/1
Description: