H - PowerPoint PPT Presentation

About This Presentation
Title:

H

Description:

tre capable de faire appel au constructeurs, m thodes et champs des superclasses. ... On ne peut pas juste appeler gonfler(r) dans la m thode gonfler de Attachee ... – PowerPoint PPT presentation

Number of Views:55
Avg rating:3.0/5.0
Slides: 57
Provided by: diro8
Category:

less

Transcript and Presenter's Notes

Title: H


1
HÉRITAGE
2
OBJECTIFS
  • Comprendre comment fonctionne lhéritage en Java
    ainsi que la surdéfinition des méthodes dune
    classe parent (superclasse, classe ancêtre).
  • Être capable de faire appel au constructeurs,
    méthodes et champs des superclasses.
  • Comprendre la superclasse commune Object et
    surdéfinir ses méthodes toString, equals et clone.

3
Codes
  • Baloune
  • Baloune
  • Attachee
  • Coloree
  • Effacable
  • Etang

4
Définition intuitive
  • Par héritage on entend la propriété que possède
    les instances de sous-classes daccéder aux
    données et aux méthodes associées à sa
    super-classe.

5
Diagramme UML Baloune
Les instances des sous-classes de Baloune
bénéficient du travail accompli pour créer
(constructeur), gonfler, degongler, deplacer,
afficher, etc, des balounes.
6
Une hiérarchie dorganismes vivants
7
Hiérarchie dhéritage
  • Les hiérarchies de classes, sous-classes et
    sous-sous-classes sont communes
  • Exemple Hiérarchie de classes dans Swing
  • La superclasse JComponent possède les méthodes
    getWidth, getHeight qui sappliquent à toutes les
    sous-classes dobjets de linterface-usager (UI).
  • La classe AbstractButton possède les méthodes
    pour régler (set) et obtenir (get) les données
    des objets boutons, par exemple les textes et
    icônes associés.

8
Une partie de la hiérarchie des composantes de
linterface-usager (UI) Swing
9
Dualité extension vs. restriction
  • Les données et méthodes associées aux
    sous-classes sont toujours des extensions des
    propriétés des classes parents car les
    sous-classes possèdent toutes les propriétés
    associées aux super-classes ET dautres
    propriétés qui lui sont propres.
  • Une sous-classe possède donc PLUS que les
    superclasses et, donc, est plus spécialisée que
    ses superclasses. Conséquemment et dans un
    certain sens, elle est donc une restriction des
    superclasses.
  • Ces deux caractéristiques de lhéritage provoque
    une tension dans notre vision de lhéritage entre
    le voir comme une extension versus comme une
    restriction.

10
Transitivité
Baloune
  • Lhéritage est transitif.
  • Une classe hérite de ses
  • superclasses de tous les
  • niveaux.
  • La classe Effacable est une sous-classe de
    Coloree qui est une sous-classe de Baloune, alors
    Effacable hérite des attributs de Coloree et de
    Baloune.

Coloree
Attachee
Effacable
11
Le test est un ?
  • Il existe une règle pour savoir si deux concepts
    devraient être liés par une relation dhéritage,
    la règle est-un  si le concept A peut être lié
    par une relation dhéritage au concept B, la
    phrase  A est-un(e) B  devrait avoir du sens.
    Les phrases suivantes sont sensées 
  • Une attachée est une baloune.
  • Un oiseau est un animal.
  • Un chat est un mammifère.
  • Une fenêtre de texte est une fenêtre.
  • Une sphère est un objet graphique.
  • Un tableau dentiers est un tableau.
  • Par contre, les phrases suivantes sont
    inappropriées, quelque chose ne sonne pas bien
    avec elles, et donc lhéritage nest pas
    approprié 
  • Un oiseau est un mammifère.
  • Un moteur est une voiture.
  • Une balle est un mur.
  • Un tableau dentiers est un entier.
  • Il y a des fois ou lhéritage sapplique même si
    la règle échoue. Néanmoins, pour la majorité des
    cas, la règle est un bon indicateur du bon emploi
    de lhéritage.

12
Raisons dutiliser lhéritage
  • Deux motivations principales 
  • Réutilisation du code. Parce que la sous-classe
    hérite des méthodes des superclasses, le code na
    pas besoin dêtre réécrit, ce qui peut réduire
    considérablement la quantité de code nécessaire
    pour développer une nouvelle idée.
  • Réutilisation du concept. Ceci arrive quand une
    sous-classe surdéfinit les méthodes de ses
    superclasses. Bien que le code nest pas
    réutilisé, les deux classes partagent tout de
    même les spécifications des méthodes surdéfinies.

13
Baloune
  • Une Baloune est un objet sphérique dun certain
    rayon, positionné en 2D à (x, y). On peut
    gonfler, degonfler, deplacer et afficher une
    baloune. On peut aussi vérifier si un point (x,
    y) est à lintérieur de la baloune (contient), si
    une autre baloune est à lintérieur de la baloune
    (contient) et si une autre baloune touche à la
    baloune.

14
Allons voir le code de Baloune
15
contient( int px, int py )
d lt rayon
rayon
16
contient( Baloune b )
d b.rayon lt rayon
rayon
d
b.rayon
17
touche( Baloune b )
d lt rayon b.rayon
rayon
d
b.rayon
18
Héritage et méthodes
  • Surdéfinir une méthode fournir une implantation
    différente dune méthode qui existe dans la
    superclasse
  • Hériter dune méthode ne pas fournir de
    nouvelle implantation dune méthode qui existe
    dans la superclasse
  • Ajouter une méthode fournir une nouvelle
    méthode qui nexiste pas dans la superclasse

19
Héritage et champs
  • Champs hérités tous les champs de la
    superclasse sont automatiquement hérités
  • Ajouter champs fournir un nouveau champs qui
    nexiste pas dans la superclasse
  • On ne peut pas surdéfinir les champs

20
Coloree
  • Une baloune Coloree est une baloune avec une
    couleur
  • class Coloree extends Baloune    nouvelles
    méthodes   nouveaux champs
  • Toutes les méthodes de Baloune sont
    automatiquement héritées
  • Il est donc correct dappeler gonfler, degongler,
    etc sur les objets de la classe Coloree
  • Notez que lhéritage diffère de la réalisation
    dune interface
  • Une interface nest pas une classe
  • Une interface ne fournit pas dinstances de
    champs ou de méthodes à hériter.

21
Répartition des champs dune sous-classe
Coloree
couleur
Portion locale
x, y, rayon
Portion héritée
22
Allons voir le code de Coloree
23
Attachee
  • Une baloune Attachee est une baloune avec une
    corde
  • class Attachee extends Baloune    nouvelles
    méthodes   nouveaux champs
  • Toutes les méthodes de Baloune sont
    automatiquement héritées
  • Il est donc correct dappeler gonfler, degongler,
    etc sur les objets de la classe Attachee

rayon
(x, y longeurCorde - rayon)
longueurCorde
(x, y)
24
Allons voir le code de Attachee
25
gonfler
rayon
(x, y longeurCorde - rayon)
longueurCorde
(x, y)
26
Règles de surdéfinition
  • Pour définir une méthode dans une sous-classe de
    manière différente de la superclasse, on peut la
    surdéfinir, il suffit de la (re)déclarer dans la
    sous-classe.
  • On accède à la méthode de la superclasse en
    utilisant la syntaxe  super.ltnomgt (doù le nom
    superclasse). Souvent, la première étape dune
    méthode surdéfinie est de faire appel à la
    méthode de la superclasse.
  • On peut bloquer le comportement dune méthode en
    la redéfinissant mais en la laissant vide (sans
    code).

27
Redéfinitions dans Attachee
  • On peut la gonfler bien sûr ! Mais il faut tenir
    compte de la corde qui ne bouge pas lors du
    gonflage. Laffichage doit aussi tenir compte de
    la corde.
  • On doit donc redéfinir gonfler et afficher.
  • On veut également empêcher de déplacer une
    attachée.
  • On doit redéfinir deplacer mais ne pas
    limplanter pour simuler le blocage.

28
Champs hérités private
  • Considérez la méthode gonfler de Attachee
  • public boolean gonfler(int r) // augmenter
    rayon de la baloune
  • // mettre à jour r2 et diametre
  • On ne peut pas simplement mettre à jour r2 et
    diametre car ces champs sont private dans la
    superclasse
  • La sous-classe doit faire appel à des interfaces
    public

29
Invoquer une méthode de la superclasse
  • On ne peut pas juste appeler gonfler(r) dans la
    méthode gonfler de Attachee
  • Ce serait la même chose que this.gonfler(r) qui
    appellerait la même méthode récursivement
    (récursivité infinie)
  • Plutôt, il faut invoquer la méthode de la
    superclasseavec la syntaxe super.gonfler(r) qui
    appelle la méthode gonfler de la classe Baloune
  • public boolean gonfler(int r)
  • if(super.gonfler(r))
  • super.deplacer(0, -r)
  • return true
  • else return false

30
Invoquer le constructeur de la superclasse
  • public class Attachee extends Baloune
  • public Attachee(int x, int y, int rayon, int
    longueurCorde) // constructeur de la
    superclasse super(x, y - longueurCorde -
    rayon, rayon)
  • // initialise la longueur de la corde
    this.longueurCorde longueurCorde
  • ...
  • On passe les arguments au constructeur de la
    superclasse
  • Doit être le premier énoncé du constructeur de
    la sous-classe.

31
Règles dhéritage pour les constructeurs
  • Une sous-classe peut déclarer son propre
    constructeur ou utiliser le constructeur sans
    argument hérité de la superclasse.
  • Les aspects importants de lhéritage des
    constructeurs sont 
  • Si la sous-classe possède de nouvelles instances
    de variables qui ne sont pas dans la superclasse
    alors le constructeur sans argument hérité
    initialise ces variables à des valeurs de défaut,
    comme zéro pour les int, et ensuite exécute les
    instructions du constructeur de la superclasse.
  • Les autres constructeurs, avec arguments, ne
    peuvent pas être hérités.
  • Si la sous-classe déclare un constructeur, avec
    ou sans arguments, alors aucun constructeur de la
    superclasse nest hérité, pas même celui sans
    argument.

32
Allons voir le code de Attachee
33
Conversion entre références de sous-classes et
superclasses
  • Il est correct dassigner une référence de
    sous-classe à une référence de superclasse.
  • Attachee ba new Attachee(30, 40, 10,
    20)Baloune b baObject unObjet ba
  • Les références de superclasse par contre ne
    connaissent pas tout sur les sous-classes
    b.couperCorde() // ERROR

34
Des variables de types différents réfèrent à la
même instance dobjet
Attachee x 30 y 40 rayon 10 longueurCorde 20
ba b unObjet
35
Polymorphisme
  • La méthode générique public void deplacer(int
    dx, int dy)    x x dx   y y dy
  • fonctionne avec nimporte quel type de baloune
    (ordinaire, attachée, colorée, effacable)
  • Les références à des objets de sous-classes sont
    converties à des références de la
    superclasseuneAttachee.contient(uneColoree)
  • Le polymorphisme uneAttachee.gonfler(r)appelle
    Attachee.gonfler (qui tient compte de la corde)
  • Pourquoi ne pas simplement déclarer les arguments
    des méthodes comme Object ?
  • La classe Object na pas de champs rayon

36
static
  • Le mot réservé  static  permet dappeler une
    fonction directement, soit sans invoquer un objet
    particulier.
  • On peut ainsi utiliser cette méthode directement.
    On utilise aussi static pour définir des
    méthodes de comparaison de deux objets sans avoir
    à passer par un des objets. Par exemple, la
    méthode touche dans Baloune aurait pu être
    définie  static , on laurait renommer
    seTouche( Baloune a, Baloune b ).
  • On appelle la méthode directement avec les deux
    arguments, sans précéder dun objet. Toute
    méthode écrite pour Baloune fonctionnera pour
    nimporte quelle classe dérivée de Baloune.

37
final
  • Si on ne veut pas quune méthode puisse être
    redéfinie, on peut précéder sa définition par le
    mot réservé  final . Le mot peut aussi être
    utilisé avec des variables, les transformants
    ainsi en constantes et même avec des classes pour
    empêcher de créer de nouvelles classes dérivées
    de celle-ci.

38
Liaison dynamique
  • Les méthodes  static ,  final  et
     private , en fait toutes celles quon ne peut
    pas redéfinir, ne passent pas par le mécanisme de
    polymorphisme. Il ny a jamais dambiguïté et
    elles peuvent toujours êtres appelées
    directement, elles sont candidates pour être
    définies  inline , cest-à-dire que le
    compilateur insert leurs instructions dans le
    code généré plutôt que dinsérer des appels de
    méthodes.

39
Surdéfinition des variables
  • Surdéfinir une variable nest pas possible au
    sens de lhéritage. On peut cependant déclarer
    des variables de même nom, appelé lombrage des
    variables. Lombrage ne passe jamais par le
    mécanisme de liaison dynamique, càd que les
    variables accédées sont toujours celles de la
    classe de la référence (fixée à la définition) et
    non pas celles des instances référées au moment
    de laccès.

40
Classes abstraites
  • Une méthode abstraite est une spécification de
    méthode sans implantation. En Java, on utilise
    le mot réservé  abstract . Similairement, une
    classe abstraite est une spécification de classe
    dont les méthodes sont abstraites.
  • Voici les règles 
  • Toute classe qui définit une méthode abstraite
    est automatiquement abstraite et doit être
    déclaré ainsi.
  • Une classe abstraite ne peut être instanciée (on
    ne peut pas créer des instances de ce type).
  • Une sous-classe de classe abstraite peut être
    instanciée si elle implante toutes les méthodes
    abstraites de la superclasse.
  • Si une sous-classe dune classe abstraite
    nimplante pas toutes les méthodes abstraites
    quelle hérite, cette sous-classe est abstraite.

41
Exemple de classes abstraites
  • public abstract class A
  • public abstract double d1()
  • public abstract double d2()
  • public class B extends A
  • public double d1() return 0.0
  • public double d2() return 1.0
  • public class C extends A
  • public double d1() return 100.0
  • public double d2() return 101.0

42
Exemple
  • A objs new A2
  • double blackHole
  • objs0 new B()
  • objs1 new C()
  • blackHole objs0.d1() // 0.0
  • blackHole objs0.d2() // 1.0
  • blackHole objs1.d1() // 100.0
  • blackHole objs1.d2() // 101.0

Les sous-classes de A peuvent être affectées aux
éléments dun tableau de A. Sans quaucun
 cast  soit nécessaire. La liaison dynamique
permet dappeler les méthodes de A même si la
classe A na pas implanté ces méthodes. Si les
méthodes navaient pas été déclarées dans A, une
erreur aurait été signalée à la compilation.
43
Niveaux daccès de contrôle
  • public
  • private
  • protected (accessible par les sous-classes dans
    le package)
  • Accès package (par défaut)

44
Mécanismes daccès
Visibilité public défaut protected private protected private
Aux non-sous-classes du même package oui oui oui non non
Aux sous-classes du même package oui oui oui non non
Aux non-sous-classes dun autre package oui non non non non
Aux sous-classes dun autre package oui non non non non
Hérité par les sous-classes du même package oui oui oui oui non
Hérité par les sous-classes dun autre package oui non oui oui non
45
Mécanismes daccès
46
Mécanismes daccès
  • 1. Si une variable ou une méthode (un membre) est
     public  dans une classe, elle lest aussi dans
    toutes ses sous-classes. Un membre  public 
    est accessible aux clients de la classe et des
    sous-classes (puisque le membre est  public 
    dans toutes ses sous-classes).
  • 2. Si un membre est  private  dans une classe,
    son utilisation est restreinte à cette classe et
    il nest pas accessible ni dans les sous-classes
    ni pour les clients de la classe ou des
    sous-classes.
  • 3. Si un membre est  protected  dans une
    classe, il est accessible dans toutes les
    sous-classes mais il ne lest pas pour les
    clients de la classe ou des sous-classes.

47
Niveaux daccès recommandés
  • Champs toujours private
  • Exceptions pour les constantes
  • public static final
  • Méthodes public ou private
  • Classes public ou protected
  • Mais en fait, il nest pas recommandé dutiliser
    protected
  • Et attention aux accès par défaut

48
Object la superclasse cosmique
  • Toutes les classes étendent Object
  • Méthodes les plus utiles
  • String toString()
  • boolean equals(Object unAutreObject)
  • Object clone()

49
La classe Object est la superclasse de toute
classe Java
Baloune
Coloree
Attachee
50
Surdéfinir la méthode toString
  • Retourne une représentation String de lobjet
    (utile pour debugger)
  • Exemple Rectangle.toString retourne quelque
    chose comme
  • java.awt.Rectanglex5,y10,width20,height30
  • toString est utilisé par lopérateur de
    concatenation
  • uneString unObjet (veut dire)
  • uneString unObjet.toString()
  • Objet.toString imprime le nom de sa classe et
    ladresse de lobjet
  • Baloune_at_d2460bf
  • Surdéfinir toString
  • public class Baloune
  •    public String toString()     return
    "Baloune(" x ", " y ", " rayon ", "
    r2 ")"     . . .

51
Surdéfinir la méthode equals
  • equals test pour une égalité de contenu
  • test pour une égalité de références
  • On doit caster lobjet passé en argument
  • public class PieceMonnaie
  •    public boolean equals(Object autreObjet)  
        PieceMonnaie autre (PieceMonnaie)autreObjet
          return nom().equals(autre.nom())
  • valeur autre.valeur   

52
b1 equals b2
Attachee x 30 y 40 rayon 10 longueurCorde 20
b1
Attachee x 30 y 40 rayon 10 longueurCorde 20
b2
53
ba b
Attachee x 30 y 40 rayon 10 longueurCorde 20
ba b
54
Surdéfinir la méthode clone
  • Copier la référence dun objet donne deux
    références au même objetBalooune b2 b1
  • Parfois, on doit faire une copie dun objet
  • Utilisez alors la méthode cloneBaloune b2
    (Baloune)b1.clone()
  • On doit caster la valeur retournée car le type
    retourné par clone est Object
  • Définir la méthode clone pour faire de nouveaux
    objetspublic Object clone()    Baloune clonee
    new Baloune()       return clonee
  • ATTENTION Cette approche ne marche pas avec
    lhéritage.

55
À compléter
56
Pétage de balounes
  • On veut développer un jeu de pétage de balounes.
    Des balounes de tailles et couleurs différentes
    saffichent à lécran et à laide de la souris on
    les pète en cliquant dessus. Le jeu calcule le
    temps pris pour péter toutes les balounes et nous
    classe dans trois catégories selon le temps pris
     très rapide ,  assez rapide  et  pas
    vite . Le jeu permet aussi de choisir une
    vitesse daffichage des balounes  lent ,
     moyen  ou  rapide .
Write a Comment
User Comments (0)
About PowerShow.com