Title: H
1HÉRITAGE
2OBJECTIFS
- 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.
3Codes
- Baloune
- Baloune
- Attachee
- Coloree
- Effacable
- Etang
4Dé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.
5Diagramme 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.
6Une hiérarchie dorganismes vivants
7Hié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.
8Une partie de la hiérarchie des composantes de
linterface-usager (UI) Swing
9Dualité 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.
10Transitivité
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
11Le 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.
12Raisons 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.
13Baloune
- 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.
14Allons voir le code de Baloune
15contient( int px, int py )
d lt rayon
rayon
16contient( Baloune b )
d b.rayon lt rayon
rayon
d
b.rayon
17touche( Baloune b )
d lt rayon b.rayon
rayon
d
b.rayon
18Hé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
19Hé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
20Coloree
- 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.
21Répartition des champs dune sous-classe
Coloree
couleur
Portion locale
x, y, rayon
Portion héritée
22Allons voir le code de Coloree
23Attachee
- 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)
24Allons voir le code de Attachee
25gonfler
rayon
(x, y longeurCorde - rayon)
longueurCorde
(x, y)
26Rè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).
27Redé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.
28Champs 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
29Invoquer 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
30Invoquer 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.
31Rè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.
32Allons voir le code de Attachee
33Conversion 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
34Des 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
35Polymorphisme
- 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
36static
- 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.
37final
- 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.
38Liaison 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.
39Surdé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.
40Classes 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.
41Exemple 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
42Exemple
- 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.
43Niveaux daccès de contrôle
- public
- private
- protected (accessible par les sous-classes dans
le package) - Accès package (par défaut)
44Mé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
45Mécanismes daccès
46Mé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.
47Niveaux 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
48Object la superclasse cosmique
- Toutes les classes étendent Object
- Méthodes les plus utiles
- String toString()
- boolean equals(Object unAutreObject)
- Object clone()
49La classe Object est la superclasse de toute
classe Java
Baloune
Coloree
Attachee
50Surdé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 ")" . . .
51Surdé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
-
52b1 equals b2
Attachee x 30 y 40 rayon 10 longueurCorde 20
b1
Attachee x 30 y 40 rayon 10 longueurCorde 20
b2
53ba b
Attachee x 30 y 40 rayon 10 longueurCorde 20
ba b
54Surdé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
56Pé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 .