Sun Services Java™ Programming Language Copyright 2005 K.ALLEM All Rights Reserved La réutilisation des classes 1 Sommaire Introduction La composition L’héritage Le polymorphisme La réutilisation des classes 2 Sommaire Introduction La composition L’héritage Le polymorphisme La réutilisation des classes 3 Introduction Réutiliser [reytilize] v.tr. de re et utiliser. Utiliser à nouveau ce qui a déjà servi. n.f réutilisation je réutiliserai ma classe existante Réutiliser des classes existantes, est indispensable pour pouvoir développer de manière productive La réutilisation s’exprime de plusieurs manières: la composition, l’héritage et le polymorphisme La réutilisation des classes 4 Sommaire Introduction La composition L’héritage Le polymorphisme La réutilisation des classes 5 La composition Réutiliser en composant: une classe peut en référencer une autre classe La composition associe un objet à un autre objet, définissant une relation « a un » entre ces deux objets La réutilisation des classes 6 En UML… Agrégation et composition Une agrégation est un cas particulier d’association non symétrique exprimant une relation de contenance Une composition est une agrégation plus forte impliquant que: un élément ne peut appartenir qu’a un seul agrégat composite La destruction de l’agrégat composite entraîne la destruction de tous ses éléments (le composite est responsable du cycle de vie de parties) La réutilisation des classes 7 La composition Java UML En Java, la réutilisation en composant s’exprime de cette façon: Agrégat private ClasseReutilisée champ; Composite La réutilisation des classes 1..* 1 0..* 0..* Élément Élément 8 Exemple en UML La réutilisation des classes 9 Exemple en Java public class Adresse { public class Personne { private String rue; private int codePostal; private String ville; … } private String nom; private String prenom; private Adresse adresse; } La réutilisation des classes 10 Sommaire Introduction La composition L’héritage Le polymorphisme La réutilisation des classes 11 Réutiliser en héritant: une classe peut reprendre les caractéristiques d’une autre classe L’héritage définit une relation « est un » entre deux classes, une sous classe héritant de sa super classe La réutilisation des classes 12 Généralisation, super classe, sous classe Une super classe est une classe plus générale reliée à une plusieurs ou plusieurs autres classes plus spécialisées (sous classes) par une relation de généralisation Les sous classes « héritent » des propriétés de leur super classe et peuvent comporte des propriété spécifiques supplémentaires La réutilisation des classes 13 Classe A Classe A1 Classe A2 La réutilisation des classes 14 L’héritage Java UML En Java, la réutilisation en héritant s’exprime de cette façon: SuperClasse class SuperClasse { //champs et méthodes } class SousClasse extends SuperClasse { //champs et méthodes supplémentaires SousClasse } La réutilisation des classes 15 On ne crée un lien d’héritage entre deux classes que si une instance de la sous classe peut être considéré aussi comme instance de sa super classe par la relation est un la super classe ne se trouve pas nécessairement dans le même paquetage que la sous classe La réutilisation des classes 16 exemple La réutilisation des classes 17 Lors de la création d’un objet, la partie qui dépend de sa super classe est initialisée en premier, avant celle qui dépend de sa propre classe. Si l’initialisation de la super classe requiert l’appel d’un constructeur avec paramètres, le passage des valeurs à ce constructeur s’effectue dans le constructeur de la classe dérivée avec comme première instruction super(params); La réutilisation des classes 18 exemple Les membres private d’une super classe restent inaccessibles depuis ses sous classes Les membres freindly d’une super classe sont accessibles depuis les sous classes qui appartiennent au même paquetage de la super classe Les membres protected d’une super classe sont accessibles depuis n’importe quelle sous classe, quel que soit le paquetage de ces classes Les membres public d’une super classe sont bien sûr accessibles depuis ses classes La réutilisation des classes 19 Remarques L’héritage multiple n’existe pas en Java L’héritage multiple du C++ peut être remplacé par la possibilité d’implémenter plusieurs interfaces dans une classe Une classe n’hérite pas des constructeurs de sa super classe On doit donc ajouter un constructeur à une classe si sa super classe n’a pas de constructeur sans paramètre La réutilisation des classes 20 Le test « est un » Le test Est un une règle simple pour savoir si 2 classes doivent être liées par une relation d’héritage : si A peut être liée à B, la phrase “A est un B” devrait avoir du sens. Par exemple : un oiseau est un animal un chat est un mammifère une tarte aux pommes est une tarte une fenêtre de texte est une fenêtre une sphère est un objet graphique un tableau d’entiers est un tableau La réutilisation des classes 21 Par contre, les phrase suivantes sont inappropriées et donc l’héritage n’est pas approprié : un oiseau est un mammifère une tarte au pomme est une pomme un moteur est une voiture un tableau d’entiers est un entier La réutilisation des classes 22 La relation d’héritage est transitive : les méthodes et les variables sont héritées à travers tous les niveaux (sans limitation du nombre de niveaux) La réutilisation des classes 23 La réutilisation des classes 24 La réutilisation des classes 25 redéfinition de méthodes Une méthode non private est redéfinie (overridden) quand elle est définie dans une sous classe avec le même identificateur, le même nombre de paramètre, et le même type pour chacun des paramètres La réutilisation des classes 26 redéfinition de méthodes Une sous-classe peut ajouter des variables et/ou des méthodes à celles qu’elle hérite de sa super-classe. Une sous-classe peut redéfinir (override) les méthodes dont elle hérite et fournir ainsi des implémentations spécialisées pour celles-ci La réutilisation des classes 27 Redéfinition d’une méthode Lorsque la classe définit une méthode dont le nom, le type des paramètres et le type de retour sont strictement identiques à ceux d’une méthode dont elle hérite nom + types paramètres + type retour = signature Lorsqu’une méthode redéfinie par une classe est invoquée par un objet de cette classe, c’est la nouvelle définition et non pas celle de la superclasse qui est exécutée La réutilisation des classes 28 La réutilisation des classes 29 Ne pas confondre redéfinition (overridding) avec surcharge (overloading) La réutilisation des classes 30 Il faut faire attention à la signature des méthodes : deux signatures différentes définissent deux méthodes différentes, même si elles ont le même nom ! La réutilisation des classes 31 Exercice La réutilisation des classes 32 Sommaire Introduction La composition L’héritage Le polymorphisme La réutilisation des classes 33 Réutiliser avec le polymorphisme: modifier l’implémentation des méthodes d’une autre classe Le polymorphisme est rendu possible grâce à l’héritage (est un) et à la redéfinition des méthodes La réutilisation des classes 34 Le polymorphisme est la faculté d’une classe à prendre plusieurs formes Si une classe et ses sous classes implémentent différemment un même message, les objets des sous classes prennent des formes différentes pour ce message du point de vue de leur super classe La réutilisation des classes 35 La possibilité de designer un objet d’une sous classe par une référence relevant de sa super classe est la traduction Java de la relation est un boisson = whisky; boisson =(Boisson)whisky; c’est tellement logique que Java n’oblige pas à noter la classe de conversion!! La réutilisation des classes 36 Relation « est un » et conversion de références Les conversions opérant sur une références utilisent la syntaxe: reference1=(Classe)reference2; Les conversions changent la classe d’une référence sans transformer ni la valeur de cette référence ni l’objet qu’elle désigne Les conversions sont autorisées à la compilation si la classe de conversion et la classe de référence ont un lien d’héritage entre elles La réutilisation des classes 37 Lors de l’exécution, la JVM vérifie que la classe de conversion est effectivement celle de l’objet référencé ou une super classe de cet objet La réutilisation des classes 38 exemple class ConversionsReferencesBoisson { public static void main (java.lang.String [] args) { // Création d'objets Boisson eau = new Boisson ("Eau min\u00e9rale", 1f); BoissonAlcoolisee whisky = new BoissonAlcoolisee ("Whisky", 7.4f, 45); // Declaration d'autres références pour les tests Boisson boisson; BoissonAlcoolisee boissonForte; Boisson boissonInconnue = null; Service service; La réutilisation des classes 39 boisson = (Boisson)whisky; // Compilation OK et exécution OK : // Conversion d'une référence d'une classe vers sa super classe acceptée. Le whisky est une boisson La réutilisation des classes 40 javax.swing.JOptionPane.showMessageDialog (null, boisson.getNom ()); // Avec la référence boisson, on peut appeler toutes les méthodes de la classe // Boisson mais pas les méthodes supplémentaires de // BoissonAlcoolisee, classe effective de l'objet designé //affiche whisky La réutilisation des classes 41 boissonForte = (BoissonAlcoolisee)boisson; // Compilation OK et exécution OK : // Conversion d'une référence d'une classe vers sa sous classe acceptée // a la compilation et a l'exécution, si l'objet référence est effectivement // une instance de la sous classe. A l'exécution, l'objet désigné par boisson // est bien un objet de classe BoissonAlcoolisee La réutilisation des classes 42 boissonForte = (BoissonAlcoolisee)boissonInconnue; // Compilation OK et exécution OK : // Conversion d'une référence d'une classe vers sa sous classe acceptée // a la compilation et a l'exécution, si l'objet référencé est inconnu. La réutilisation des classes 43 boissonForte = (BoissonAlcoolisee)eau; // Compilation OK mais exception java.lang.ClassCastException a l'execution : // Conversion d'une référence d'une classe vers sa sous classe acceptee // a la compilation mais refusee a l'execution, si l'objet referencé n'est pas // effectivement une instance de la sous classe. A l'execution l'objet // designé par eau n'est pas un objet de classe BoissonAlcoolisee, la JVM déclenche un exception qui interrompt le cours du programme La réutilisation des classes 44 Intérêt Le polymorphisme offre : Une plus grande simplicité du code Plus besoin de distinguer différents cas en fonction de la classe de l’objet La réutilisation des classes 45 Et surtout une plus grande facilité d’évolution du code Les programmes sont plus facilement extensibles car il est possible de définir de nouvelles fonctionnalités en héritant de nouveaux types de données à partir d’une classe de base commune sans avoir besoin de modifier le code qui manipule l’interface de la classe de base En d’autres termes, vous pouvez écrire des programmes capables de travailler avec du code (classes) qui n’existent pas encore ! La réutilisation des classes 46 La réutilisation des classes 47 La réutilisation des classes 48 La réutilisation des classes 49 La réutilisation des classes 50 La réutilisation des classes 51 La réutilisation des classes 52 La réutilisation des classes 53 La réutilisation des classes 54 La réutilisation des classes 55 La réutilisation des classes 56 La réutilisation des classes 57 La réutilisation des classes 58 La réutilisation des classes 59 La réutilisation des classes 60 public class Adresse { private String rue; // Champ memorisant la rue et son numero private int codePostal; // Champ memorisant le code postal private String ville; // Champ memorisant la ville d'une adresse public Adresse (String rue, int codePostal, String ville) { this.rue = rue; this.codePostal = codePostal; this.ville = ville; } public java.lang.String getRue() { return this.rue; } public int getCodePostal() { return this.codePostal; } public java.lang.String getVille() { return this.ville; } } La réutilisation des classes 61 public class Personne { private String nom; // Champ memorisant le nom d'une personne private String prenom; // Champ memorisant le prenom d'une personne private Adresse adresse; // Champ memorisant l'adresse d'une personne public Personne (String nom, String prenom) { this.nom = nom; this.prenom = prenom; } public String getNom() { return this.nom; } public String getPrenom() { return this.prenom; } /** * Modifie l'adresse de cette personne. */ public void setAdresse (Adresse adresse) { this.adresse = adresse; } /** * Renvoie l'adresse de cette personne. */ public Adresse getAdresse() { return this.adresse; } La réutilisation } des classes 62 class DeuxPersonnesUneAdresse { public static void main (String[] args) { Personne personne1; // Creation d'une instance de Personne pour Thomas Durand personne1 = new Personne ("Durand", "Thomas"); Adresse adresse1; // Creation d'une instance de Adresse adresse1 = new Adresse("5, rue de Rennes", 7000, "MONS"); // Affectation de son adresse a Thomas personne1.setAdresse (adresse1); // Creation d'une autre instance de Personne pour Sophie Martin Personne personne2 = new Personne("Martin", "Sophie"); // Affectation directe de l'autre adresse avec une nouvelle instance personne2.setAdresse(new Adresse("3, pl. de la Gare", 6000, "CHARLEROI")); // Plus tard... Sophie demenage chez Thomas et partage donc son adresse personne2.setAdresse (personne1.getAdresse ()); // Plus tard... Ils s'agrandissent et demenagent tous les deux Adresse adresseCommune = new Adresse("8, rue de Rennes", 7000, "MONS"); personne1.setAdresse (adresseCommune); personne2.setAdresse (adresseCommune); // Et vous annonce la nouvelle. Les references renvoyees par // personne1.getAdresse() et personne2.getAdresse() sont egales et designent le meme objet La réutilisation des classes 63 String adresse = personne1.getAdresse().getRue() + " \u00e0 " + personne2.getAdresse().getVille(); La réutilisation des classes 64