la réutilisation des classes1 sun services java programming language copyright 2005 k.allem all...

64
La réutilisation des classes 1 Sun Services Java™ Programming Language Copyright 2005 K.ALLEM All Rights Reserved

Upload: raymonde-cartier

Post on 03-Apr-2015

102 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 1

Sun Services

Java™ Programming Language

Copyright 2005 K.ALLEM All Rights Reserved

Page 2: La réutilisation des classes1 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

Page 3: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 3

Sommaire

Introduction La composition L’héritage Le polymorphisme

Page 4: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 5: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 5

Sommaire

Introduction La composition L’héritage Le polymorphisme

Page 6: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 7: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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)

Page 8: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 9: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 9

Exemple en UML

Personne

rue : StringcodePostal : Integerville : String

Adresse

nom : Stringprenom : Stringadresse : Adresse0..*11 0..*

Page 10: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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;

}

Page 11: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 11

Sommaire

Introduction La composition L’héritage Le polymorphisme

Page 12: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 13: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 14: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 14

Classe A1 Classe A2

Classe A

Page 15: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 16: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 17: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 17

exemple

Boisson

nom : Stringprix : Float

getNom() : StringgetPrix() : Float

BoissonAlcoolisee

Page 18: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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);

Page 19: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 20: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 21: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 22: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 23: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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)

Page 24: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 24

Page 25: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 25

Page 26: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 27: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 28: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 29: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 29

Page 30: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 30

Ne pas confondre redéfinition (overridding) avec surcharge (overloading)

Page 31: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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 !

Page 32: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 32

Exercice

Boisson

nom : Stringprix : Float

getNom() : StringgetPrix() : Float

BoissonAlcoolisee

degreAlcool : Integer

getDegreAlcool() : Integer

Page 33: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 33

Sommaire

Introduction La composition L’héritage Le polymorphisme

Page 34: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 35: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 36: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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!!

Page 37: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 38: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 39: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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;

Page 40: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 41: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 42: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 43: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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.

Page 44: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 45: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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

Page 46: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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 !

Page 47: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 47

Page 48: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 48

Page 49: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 49

Page 50: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 50

Page 51: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 51

Page 52: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 52

Page 53: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 53

Page 54: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 54

Page 55: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 55

Page 56: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 56

Page 57: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 57

Page 58: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 58

Page 59: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 59

Page 60: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 60

Page 61: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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; }}

Page 62: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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; }}

Page 63: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

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); }}

Page 64: La réutilisation des classes1 Sun Services Java Programming Language Copyright 2005 K.ALLEM All Rights Reserved

La réutilisation des classes 64