Bonjour à tous. Bienvenue dans la séquence 1 de cette
semaine 4, semaine dans laquelle nous allons couvrir les
aspects d'héritage en Pharo, le mécanisme de LookUp et
du développement Web.
Dans cette première séquence, nous allons introduire les
notions d'héritage.
Vous verrez que ces notions sont très proches de la
notion d'héritage dans d'autres langages à classes, notamment Java.
Je vous conseille quand même de regarder, même si vous
êtes familiarisés avec ces notions, car nous allons
introduire du vocabulaire et une représentation graphique
qu'on va réutiliser ensuite dans tous les slides et
toutes les séquences qui vont suivre.
Alors dans cette séquence nous allons couvrir, qu'est-ce
que l'héritage et comment l'utiliser.
Vous pouvez voir, sur la droite, une représentation de 2
classes: la classe Rectangle, avec tout d'abord son nom,
ses variables d'instance et ses méthodes.
En-dessous la même chose, le nom de la classe
ColoredRectangle, ses variables d'instance, ses méthodes.
La flèche verticale ici, on voit que c'est un triangle
vide comme tête de flèche, indique une relation d'héritage.
Donc la sous-classe ColoredRectangle hérite de la classe Rectangle.
La classe ColoredRectangle, les sous-classes en général
raffinent le comportement et l'état de leurs super classes.
Une sous-classe, comme ici ColoredRectangle, peut ajouter
de l'état et du comportement à sa super classe.
Donc là, la classe ColoredRectangle, elle ajoute de l'état
sous la forme de 2 variables d'instance, color
et borderedColor, et une méthode, la méthode color.
Toutes les classes héritent, à un moment ou à un autre
de la classe object.
En fait ce n'est pas tout à fait exact.
Toutes les classes, on est sûr qu'elles héritent de la classe ProtoObject.
Cependant la classe Proto Object, c'est plus un détail
qui va servir dans des cas extrêmement précis et donc
dans le reste de ce cours nous dirons que toutes les
classes héritent de object, et ça nous suffira pour
comprendre l'ensemble des mécanismes de Pharo.
La classe ProtoObject étant laissée dans certains cas
vraiment très spécifiques. Et il y a peu de chances que
vous en ayez besoin si vous êtes seulement en train d'apprendre Pharo.
Alors l'héritage se comporte de 2 façons différentes
suivant que c'est l'héritage de l'état ou l'héritage du comportement.
L'héritage de l'état est statique.
Ça signifie qu'au moment où on va créer la sous-classe,
dans la sous-classe on va savoir exactement quelles sont
l'ensemble de ces variables d'instances.
Par contre pour le comportement, on va faire ça
dynamiquement, c'est-à-dire que pendant l'exécution du
programme on va regarder quelles sont les méthodes
définies dans les sous-classes et dans les super classes.
Donc au niveau des variables d'instance, l'héritage des
variables d'instance se fait à la création de la sous-classe.
Donc à la création de la sous-classe, on va prendre les
variables d'instance définies dans la sous-classe, donc
ici color et border color, et on va faire l'
union avec toutes les variables d'instance définies dans
la super classe, dans la super classe de la super classe,
et caetera jusqu'à remonter à object.
Donc ici les variables d'instance de ColoredRectangle
seront Width height color et border color.
Pour le comportement le mécanisme est complètement
différent, et plusieurs des séquences qui vont suivre
vont présenter exactement comment ça se passe.
Globalement, l'héritage de comportement se fait à l'exécution.
C'est-à-dire que lorsqu'on envoie un message à un objet,
la méthode correspondante va être recherchée dans la hiérarchie de classes.
Donc là, si j'envoie un message à ColoredRectangle, le
message Area par exemple, on va le chercher
dans sa classe, on va chercher la méthode correspondante
dans la classe de A color rectangle.
On ne trouve pas la méthode Area donc on remonte
dans la super classe, on cherche la méthode Area, on la
trouve, c'est celle-ci qui est sélectionnée qui va être exécutée.
Alors pour résumer.
L'héritage, donc cette notion de sous-classe et de super
classe, permet à une sous-classe de raffiner le
comportement de sa super classe et de l'étendre.
La sous-classe peut aussi étendre, c'est-à-dire ajouter
de l'état à sa super classe.
Pharo a un modèle d'héritage simple, donc une classe a
une et une seule super classe.
Il est possible de faire une sorte d'héritage multiple
face à la notion de trait, mais nous n'aborderons pas cette notion ici.
En haut de la hiérarchie on trouve object et aussi la
classe ProtoObject, mais on ne rentrera pas dans ce détail.
L'héritage d'état est statique, c'est-à-dire qu'il se
fait lorsque la sous-classe est définie, tandis que l'héritage
de comportement est dynamique, il se fait à l'exécution
du programme chaque fois qu'on envoie un message à un objet.