Java uik-chap6-poo heritage v2 java

download Java uik-chap6-poo heritage v2 java

of 97

  • date post

    20-Jun-2015
  • Category

    Documents

  • view

    581
  • download

    8

Embed Size (px)

Transcript of Java uik-chap6-poo heritage v2 java

  • 1. Concepts OO Hritage 1

2. Plan1. Hritage2. Polymorphisme3. Surcharge4. this & super5. Final6. Variables & mthodes statiques7. cast2 3. 2.Hritage et polymorphisme Lhritage permet de crer des classespar combinaison de classes djexistantes 3 4. 4 5. Hritage et polymorphismeDfinition de lhritage Lorsquune classe hrite dune autre classe,elle bnficie automatiquement de sesdfinitions dattributs et de mthodes. Elle peut y ajouter ses propres dfinitions, cequi permet facilement de constituer unensemble fonctionnellement plus riche. Les liens dhritage spcifient une hirarchiede classe qui peut tre constitue par unedmarche de spcialisation, ou au contrairede gnralisation.5 6. Il est courant en programmation de crer un modlede quelque chose, par exemple, un employ(Employee), puis de sapercevoir quon a besoindun modle de quelque chose qui est une versionspcialise de ce modle dorigine. Dans ce cas prcis, nous pourrions vouloir unmodle de manager (Manager). Il est clair quunmanager est un employ, mais un employprsentant des caractristiques supplmentaires.Considrez les exemples de dclarations de classessuivants : 6 7. public class Employee { public class Manager {String name;String name;Date hireDate;Date hireDate;Date dateOfBirth; Date dateOfBirth;String jobTitle;String jobTitle;int grade;int grade;} String department;Employee [] subordinates;}7 8. On saperoit quil y a des partieredondantes. En ralit, plusieurs champs sont applicables Employee et sont aussi requis par la classeManager .8 9. Note Lutilisation du copier-coller dans unditeur ne rsoud pas le problme car lessoucis de mise jour subsistent. Si la classe Employee est modifie, vousdevrez probablement aussi mettre jourManager.9 10. Dans les langages orients-objet, desmcanismes spciaux sont fournis pourpermettre au programmeur de dfinir uneclasse en fonction dune classe dj dfinie :cest lhritage. Dans Java, cette opration seffectue laidedu mot-cl extends de la faon suivante : 10 11. public class Managerpublic class Employee extends Employee {{ String department;String name;Employee []Date hireDate;subordinates;Date dateOfBirth; }String jobTitle;int grade;} 11 12. 12 13. La classe Manager est dfinie maintenantpour comporter toutes les variables etmthodes quun employ possde. Toutes ces variables et mthodes sonthrites de la dfinition de la classe parent. Le programmeur na plus qu dfinir desfonctions supplmentaires, ou, comme nousle verrons bientt, indiquer les modifications appliquer. 13 14. Note Cette approche marque un grandprogrs en matire de mise jour et donc defiabilit. Lors dune correction dans la classeEmployee, la classe Manager est corrigesans intervention du programmeurt. 14 15. Hritage simple Java permet une classe de slargir(extend) relativement une seule autreclasse. Cette restriction est appele hritage simple. Certains langages permettent de dfinir uneclasse partir de plusieurs autres, cestlhritage multiple qui nexiste pas dans Java.15 16. La classe Object est la classe mre de toutesles classes Par dfautclass Personne extends Object {}16 17. 17 18. Spcialisation des mthodes On considre deux classes lies parlhritage. Par exemple :class Employee {}class Manager extends Employee {}18 19. Souvent une mthode est dfinie dans laclasse de base, mais a besoin dtre "affine"dans la classe drive. On a par exemple :class Employee {void calculPrime() {// une prime pour un employe}} 19 20. Les deux mthodes de ces deux classes ontmme signature. On dit que la mthode calculPrime() de laclasse Manager spcialise la mthodecalculPrime() de la classe Employee.20 21. Polymorphisme Le nom de la mthode calculPrime()dnote alors 2 codes distincts. Autrement dit lidentificateur calculPrimereprsente "plusieurs formes" de codedistinct. On parle de polymorphisme. 21 22. On utilise le polymorphisme laide dunerfrence dobjet de classe de base. Parexemple on crit en Java :Employee e = new Employee();e.calculPrime(); // lance la methodecalculPrime() de la classe Employee 22 23. mais aussiEmployee e = new Manager();e.calculPrime(); // lance la methodecalculPrime() de la classe Manager 23 24. Un des avantages de ceci est de pouvoirutiliser une seule rfrence e de la classeEmployee pour rfrencer un Employee ouun Manager. Cest possible car un Manager (classedrive de la classe Employee) est unEmployee : smantique de lhritage. Mais 24 25. le gros avantage du polymorphisme est depouvoir rfrencer des objets sans connatre la compilation vritablement leur classe, etde pouvoir par la suite, lexcution lancer lecode appropri cet objet. Tout ceci au moment de lexcution duprogramme (et non pas la compilation). 25 26. Polymorphisme = liaison dynamique Au moment de la compilation, le compilateur ne saitpas si cest la mthode calculPrime() de la classeEmployee ou celui de la classe Manager qui seralanc. Autrement dit, la liaison entre lidentificateurcalculPrime() et le code lancer est dtermin lexcution du programme (suivant le choix delutilisateur du programme). On dit alors que la liaison est dynamique.26 27. Remarquer que si e rfre un Manager,lappel de la mthode calculPrime() de laclasse Employee nest pas fait (sauf simentionner explicitement par le programmeurdans le code de la mthode calculPrime() dela classe Manager). Le code lancer est dtermin suivant laclasse de lobjet et non pas la classe de larfrence cet objet. 27 28. Comment cela fonctionne ? Java est dit un langage objet pur (comme Smalltalk etcontrairement C++) car le mcanisme de recherche de lamthode lancer est automatique et systmatique sans que leprogrammeur ait le prciser. En Java un appel comme :e.calculPrime(); recherche, au moment de lexcution lobjet rfrenc par e. Connaissant alors lobjet, linterprteur cherche, si dans la classede cet objet, cette mthode existe. Si cest le cas, cette mthodeest lance et le processus est termin. Si ce nest pas le cas,linterprteur refait cette recherche dans la classe de base et leprocessus est relanc sur cette classe de base, jusqu trouverune telle mthode. Si une telle mthode nest pas trouve, une exception est leve. 28 29. Ce mcanisme qui a le mrite dtre simplepour le programmeur, a linconvnient dtreindterministe en temps de recherche et depouvoir tre lent lexcution (do un autremcanisme dterministe propos dans deslangages comme C++). 29 30. En conclusion Il est fondamental de voir que pour utiliser lepolymorphisme, il faut : exploiter le mcanisme dhritage sur les classesou utiliser des interfaces. rfrencer les objets par la classe de base ou parlinterface. 30 31. public class Managerpublic class Employee extends Employee {{ String department;String name;Employee []Date hireDate;subordinates;Date dateOfBirth; }String jobTitle;int grade;} 31 32. class Societe public void affichePrime(){{ for (int i=0;i double)pourraient tre appliques, qui risqueraient de crer laconfusion dans certains cas. Le type de retour des mthodes peut tre diffrent, maiscette diffrence seule ne suffit pas. Les types de la listedargument des diffrentes mthodes surcharges doiventimprativement diffrer. La surcharge est aussi appel parfois lasurdfinition.45 46. Il ne faut pas confondre les notions desurcharge (ou surdfinition) etpolymorphisme (ou liaison dynamique) quiont finalement peu de point commun. Voici un tableau qui rsume les diffrences :46 47. 47 48. Rfrence this En Java, lors de lcriture dune mthodevous pouvez faire rfrence lobjet courant(qui a lanc cette mthode) laide delidentificateur this. On utilise cette rfrencedans les cas:48 49. Premier cas Passage de la rfrence de lobjet courant lamthode : // les mthodes drawImage() de la classe Graphics drawImage( . . . , this); .... // doivent informer rgulirement lobjet courant // de ltat davancement du chargement de limage.49 50. Supposons quun Cercle possde unerfrence sur la Fentre graphique laquelleil est attach50 51. 51 52. Association et usage de this - Le this permet un objet dobtenir une rfrence sur lui-mme. Ceci esttrs utile lorsquun objet a besoin de laisser une carte de visite un autreobjet pour lui dire cest moi qui tai contact, voici par quelle rfrence tupeux mutiliser. Avec lexemple, voici ce qui se produit : 1. Cercle dfinit un attribut fenetre qui va permettre chaque instance derfrencer sa fentre (celle o il est affich). 2. Dans ce cas, un Cercle nest pas propritaire de la fentre dans laquelle il setrouve. Le constructeur de Cercle nest pas responsable de la cration de lafentre. Celle-ci est cre indpendamment en dehors de la classe Cercle. 3. Lattribut fenetre de Cercle est mis jour par la mthode placer() 4. Fenetre possde une liste de Cercles. La mthode placer() gre lasuppression du cercle dans lancienne fentre et lajout dans la nouvelle, eninvoquant ajouter() et enlever() de la classe Fenetre. Ces mthodes prennent enparamtre un Cercle. Celui-ci nest autre que le receveur de la mthode placer(),rfrenc par this.52 53. Leve dune ambiguit :class Client {String nom ;String clientID ;....Client(String nom, String ID) {this.nom = nom ;clientID = ID ; // this implicite}....}53 54. Exemple de this explicite54 55. Appel dun constructeur de la mme classe :public MaClasse(int a, int b) {...}public MaClasse(int c) {this(c, 0);}public MaClasse() {this(10);}55 56. public class Personne {String nom,prenom;Public void affiche(){System.out.println(this);//System.out.println(this.toString());//System.out.println(toString());}public String toString(){return nom= +nom+ prenom=+prenom;}public static void main(String args[]){Personne p = new Personne();//System.out.println(p);System.out.println(p.toString());}}56 57. Rfrence super En Java, lors dun hritage vous pouvez dansune mthode de la classe drive rfrencerla partie provenant de la classe de base laide de lidentificateur super. 57 58. Premier cas :class ClientRegulier extends Client {double ristourne;public String toString() {return