la réutilisation des classes1 sun services java programming language copyright 2005 k.allem all...
TRANSCRIPT
La réutilisation des classes 1
Sun Services
Java™ Programming Language
Copyright 2005 K.ALLEM All Rights Reserved
La réutilisation des classes 2
Sommaire
Introduction La composition L’héritage Le polymorphisme
La réutilisation des classes 3
Sommaire
Introduction La composition L’héritage Le polymorphisme
La réutilisation des classes 4
Introduction Réutiliser [reytilize] v.tr. de re et utiliser.
Utiliser à nouveau ce qui a déjà servi. n.f réutilisationje 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 5
Sommaire
Introduction La composition L’héritage Le polymorphisme
La réutilisation des classes 6
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 7
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 8
La composition
Java
En Java, la réutilisationen composant s’exprime de cette façon:
private ClasseReutilisée champ;
UML
Composite Élément
Agrégat Élément1..* 0..*
0..*1
La réutilisation des classes 9
Exemple en UML
Personne
rue : StringcodePostal : Integerville : String
Adresse
nom : Stringprenom : Stringadresse : Adresse0..*11 0..*
La réutilisation des classes 10
Exemple en Javapublic 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 classes 11
Sommaire
Introduction La composition L’héritage Le polymorphisme
La réutilisation des classes 12
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 13
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 14
Classe A1 Classe A2
Classe A
La réutilisation des classes 15
L’héritage Java
En Java, la réutilisation en héritant s’exprime de cette façon:
class SuperClasse{ //champs et méthodes}
class SousClasse extends SuperClasse{ //champs et méthodes supplémentaires}
UML
SuperClasse
SousClasse
La réutilisation des classes 16
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 17
exemple
Boisson
nom : Stringprix : Float
getNom() : StringgetPrix() : Float
BoissonAlcoolisee
La réutilisation des classes 18
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 19
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 20
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 21
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 animalun chat est un mammifèreune tarte aux pommes est une tarteune fenêtre de texte est une fenêtreune sphère est un objet graphiqueun tableau d’entiers est un tableau
La réutilisation des classes 22
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 pommeun moteur est une voitureun tableau d’entiers est un entier
La réutilisation des classes 23
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 24
La réutilisation des classes 25
La réutilisation des classes 26
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 27
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 28
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 29
La réutilisation des classes 30
Ne pas confondre redéfinition (overridding) avec surcharge (overloading)
La réutilisation des classes 31
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 32
Exercice
Boisson
nom : Stringprix : Float
getNom() : StringgetPrix() : Float
BoissonAlcoolisee
degreAlcool : Integer
getDegreAlcool() : Integer
La réutilisation des classes 33
Sommaire
Introduction La composition L’héritage Le polymorphisme
La réutilisation des classes 34
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 35
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 36
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 unboisson = whisky;
boisson =(Boisson)whisky;c’est tellement logique que Java n’oblige pas à noter la classe de conversion!!
La réutilisation des classes 37
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 38
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 39
exempleclass 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 40
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 41
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 42
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 43
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 44
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 45
Intérêt Le polymorphisme offre :
Une plus grande simplicité du codePlus besoin de distinguer différents cas en fonction de la classe de l’objet
La réutilisation des classes 46
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 enhéritant de nouveaux types de données à partir d’uneclasse de base commune sans avoir besoin de modifier lecode qui manipule l’interface de la classe de base
En d’autres termes, vous pouvez écrire des programmescapables de travailler avec du code (classes) qui n’existent pas encore !
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
La réutilisation des classes 61
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 62
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 63
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 classes 64