La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved
La réutilisation des classes2 Sommaire Introduction La composition Lhéritage Le polymorphisme
La réutilisation des classes3 Sommaire Introduction La composition Lhéritage Le polymorphisme
La réutilisation des classes4 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 sexprime de plusieurs manières: la composition, lhéritage et le polymorphisme
La réutilisation des classes5 Sommaire Introduction La composition Lhéritage Le polymorphisme
La réutilisation des classes6 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 classes7 En UML… Agrégation et composition Une agrégation est un cas particulier dassociation non symétrique exprimant une relation de contenance Une composition est une agrégation plus forte impliquant que: un élément ne peut appartenir qua un seul agrégat composite La destruction de lagré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 classes8 La composition Java En Java, la réutilisation en composant sexprime de cette façon: private ClasseReutilisée champ; UML Composite Élément AgrégatÉlément 1..* 0..* 1
La réutilisation des classes9 Exemple en UML
La réutilisation des classes10 Exemple en Java public class Adresse { private String rue; private int codePostal; private String ville; … } public class Personne { private String nom; private String prenom; private Adresse adresse; }
La réutilisation des classes11 Sommaire Introduction La composition Lhéritage Le polymorphisme
La réutilisation des classes12 Réutiliser en héritant: une classe peut reprendre les caractéristiques dune autre classe Lhéritage définit une relation « est un » entre deux classes, une sous classe héritant de sa super classe
La réutilisation des classes13 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 classes14
La réutilisation des classes15 Lhéritage Java En Java, la réutilisation en héritant sexprime de cette façon: class SuperClasse { //champs et méthodes } class SousClasse extends SuperClasse { //champs et méthodes supplémentaires } UML
La réutilisation des classes16 On ne crée un lien dhé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 classes17 exemple
La réutilisation des classes18 Lors de la création dun 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 linitialisation de la super classe requiert lappel dun constructeur avec paramètres, le passage des valeurs à ce constructeur seffectue dans le constructeur de la classe dérivée avec comme première instruction super(params);
La réutilisation des classes19 exemple Les membres private dune super classe restent inaccessibles depuis ses sous classes Les membres freindly dune super classe sont accessibles depuis les sous classes qui appartiennent au même paquetage de la super classe Les membres protected dune super classe sont accessibles depuis nimporte quelle sous classe, quel que soit le paquetage de ces classes Les membres public dune super classe sont bien sûr accessibles depuis ses classes
La réutilisation des classes20 Remarques Lhéritage multiple nexiste pas en Java Lhéritage multiple du C ++ peut être remplacé par la possibilité dimplémenter plusieurs interfaces dans une classe Une classe nhérite pas des constructeurs de sa super classe On doit donc ajouter un constructeur à une classe si sa super classe na pas de constructeur sans paramètre
La réutilisation des classes21 Le test « est un » Le test Est un une règle simple pour savoir si 2 classes doivent être liées par une relation dhé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 dentiers est un tableau
La réutilisation des classes22 Par contre, les phrase suivantes sont inappropriées et donc lhéritage nest pas approprié : un oiseau est un mammifère une tarte au pomme est une pomme un moteur est une voiture un tableau dentiers est un entier
La réutilisation des classes23 La relation dhé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 classes24
La réutilisation des classes25
La réutilisation des classes26 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 classes27 redéfinition de méthodes Une sous-classe peut ajouter des variables et/ou des méthodes à celles quelle 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 classes28 Redéfinition dune 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 dune méthode dont elle hérite nom + types paramètres + type retour = signature Lorsquune méthode redéfinie par une classe est invoquée par un objet de cette classe, cest la nouvelle définition et non pas celle de la superclasse qui est exécutée
La réutilisation des classes29
La réutilisation des classes30 Ne pas confondre redéfinition (overridding) avec surcharge (overloading)
La réutilisation des classes31 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 classes32 Exercice
La réutilisation des classes33 Sommaire Introduction La composition Lhéritage Le polymorphisme
La réutilisation des classes34 Réutiliser avec le polymorphisme: modifier limplémentation des méthodes dune autre classe Le polymorphisme est rendu possible grâce à lhéritage (est un) et à la redéfinition des méthodes
La réutilisation des classes35 Le polymorphisme est la faculté dune 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 classes36 La possibilité de designer un objet dune 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; cest tellement logique que Java noblige pas à noter la classe de conversion!!
La réutilisation des classes37 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 dune référence sans transformer ni la valeur de cette référence ni lobjet quelle désigne Les conversions sont autorisées à la compilation si la classe de conversion et la classe de référence ont un lien dhéritage entre elles
La réutilisation des classes38 Lors de lexécution, la JVM vérifie que la classe de conversion est effectivement celle de lobjet référencé ou une super classe de cet objet
La réutilisation des classes39 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 classes40 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 classes41 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 classes42 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 classes43 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 classes44 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 classes45 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 lobjet
La réutilisation des classes46 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 dune classe de base commune sans avoir besoin de modifier le code qui manipule linterface de la classe de base En dautres termes, vous pouvez écrire des programmes capables de travailler avec du code (classes) qui nexistent pas encore !
La réutilisation des classes47
La réutilisation des classes48
La réutilisation des classes49
La réutilisation des classes50
La réutilisation des classes51
La réutilisation des classes52
La réutilisation des classes53
La réutilisation des classes54
La réutilisation des classes55
La réutilisation des classes56
La réutilisation des classes57
La réutilisation des classes58
La réutilisation des classes59
La réutilisation des classes60
La réutilisation des classes61 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 classes62 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 classes63 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 String adresse = personne1.getAdresse().getRue() + " \u00e0 " + personne2.getAdresse().getVille(); String nouvelle = personne1.getPrenom() + " et " + personne2.getPrenom() + " habitent maintenant au " + adresse; // Affiche Thomas et Sophie habitent maintenant au 8, rue de Rennes a Mons javax.swing.JOptionPane.showMessageDialog (null, nouvelle); }
La réutilisation des classes64