WEBVTT

00:00:00.440 --> 00:00:04.000 align:middle
Bonjour. Donc ce cours
c'est un cours vraiment avancé.

00:00:04.480 --> 00:00:06.830 align:middle
Alors on va ouvrir le capot
de Pharo et on va aller voir

00:00:07.030 --> 00:00:10.550 align:middle
comment les classes, et
toutes les relations d'instances

00:00:10.750 --> 00:00:15.190 align:middle
entre classes sont gérées, donc c'est
vraiment pour les curieux on va dire.

00:00:16.520 --> 00:00:18.160 align:middle
Donc ce qu'il faut bien
voir, c'est que vous n'en avez

00:00:18.360 --> 00:00:20.350 align:middle
absolument pas besoin pour
 programmer en Pharo, la preuve

00:00:20.550 --> 00:00:22.820 align:middle
c'est que vous avez déjà
 programmé plein de petits

00:00:23.020 --> 00:00:25.930 align:middle
 programmes et d'applications en
Pharo, sans savoir comment ça marchait.

00:00:26.440 --> 00:00:28.410 align:middle
Maintenant moi je me dis
qu'intellectuellement je serais

00:00:28.610 --> 00:00:31.140 align:middle
insatisfait si le cours ne
me montrait pas comment ça

00:00:31.340 --> 00:00:32.840 align:middle
fonctionne à l'intérieur.
Donc par exemple, moi je veux

00:00:33.040 --> 00:00:35.470 align:middle
savoir où est-ce que lui me
définit, je veux savoir mais

00:00:35.670 --> 00:00:39.430 align:middle
c'est quoi la classe de Metaclass
et, je veux comprendre tout ce bazar.

00:00:39.630 --> 00:00:41.740 align:middle
Donc c'est pour ça qu'on a
fait ce cours, donc si vous ne

00:00:41.940 --> 00:00:43.620 align:middle
comprenez pas en première
instance vous le mettez de

00:00:43.820 --> 00:00:45.610 align:middle
côté, ça ne vous empêchera
pas de faire du Pharo, par

00:00:45.810 --> 00:00:49.090 align:middle
contre si vous avez vraiment
envie de savoir ben vous l'écoutez

00:00:49.290 --> 00:00:50.760 align:middle
une deuxième fois ou une
troisième fois si nécessaire.

00:00:51.730 --> 00:00:54.800 align:middle
Alors maintenant, il y a une
clé qui est fondamentale et

00:00:55.000 --> 00:00:56.210 align:middle
qui est vraiment sympa,
c'est ce transparent-là.

00:00:57.030 --> 00:00:59.280 align:middle
Avec ce transparent
normalement vous devez comprendre.

00:00:59.660 --> 00:01:01.700 align:middle
L'idée de base c'est
toujours la même chose; de toute

00:01:01.900 --> 00:01:05.360 align:middle
façon on ne fait que répéter
ça dans ce MOOC, c'est quand

00:01:05.560 --> 00:01:08.160 align:middle
j'envoie un message à un
objet qu'est-ce que je fais?

00:01:08.360 --> 00:01:11.150 align:middle
vous devez le savoir depuis le
temps, je suis le lien d'instanciation,

00:01:11.640 --> 00:01:14.090 align:middle
je cherche dans la classe
de l'objet et si je ne le

00:01:14.290 --> 00:01:15.850 align:middle
trouve pas, je
remonte sur l'héritage.

00:01:16.050 --> 00:01:17.040 align:middle
Donc toujours ces 2 points.

00:01:17.500 --> 00:01:20.230 align:middle
Premièrement je vais sur la classe,
deuxièmement je regarde dans l'héritage.

00:01:20.430 --> 00:01:23.500 align:middle
On va faire ça
systématiquement, systématiquement et

00:01:23.700 --> 00:01:26.390 align:middle
systématiquement
encore dans ce cours.

00:01:26.950 --> 00:01:30.350 align:middle
Donc les métaclasses pour
les expliquer, on les explique

00:01:30.550 --> 00:01:32.600 align:middle
en 7 points et on va les
dérouler un par un vous allez

00:01:32.800 --> 00:01:34.890 align:middle
voir, c'est relativement
finalement c'est relativement simple.

00:01:35.770 --> 00:01:39.360 align:middle
Le premier point, chaque objet
est instance d'une classe, ouh!

00:01:40.130 --> 00:01:40.890 align:middle
ça c'est dur.

00:01:41.180 --> 00:01:45.480 align:middle
Donc là j'ai l'objet
"OrderedCollection", est instance de

00:01:45.680 --> 00:01:48.910 align:middle
la classe
OrderedCollection. Voila jusque là ça va.

00:01:50.040 --> 00:01:53.690 align:middle
Donc le deuxième point,
chaque classe va hériter

00:01:53.890 --> 00:01:55.170 align:middle
finalement de la classe objet.

00:01:57.110 --> 00:02:00.450 align:middle
Alors là ce qu'on voit c'est
que OrderedCollection hérite

00:02:00.650 --> 00:02:03.910 align:middle
de SequenceableCollection qui hérite
de Collection qui hérite de Object.

00:02:04.610 --> 00:02:07.370 align:middle
Pour info, Eventually, pour
les petits Français, ça ne

00:02:07.570 --> 00:02:09.700 align:middle
veut pas dire éventuellement
ça veut dire de manière sûre.

00:02:10.540 --> 00:02:15.380 align:middle
C'est un faux ami. Donc
voilà, on a toujours notre grappe

00:02:15.580 --> 00:02:18.040 align:middle
d'héritage, qui va de toute
façon venir pointer sur Object.

00:02:20.180 --> 00:02:22.250 align:middle
Donc qu'est-ce que c'est
finalement que la responsabilité

00:02:22.450 --> 00:02:23.210 align:middle
de la classe Object ?

00:02:23.410 --> 00:02:25.760 align:middle
La classe object représente
le comportement commun entre

00:02:25.960 --> 00:02:28.380 align:middle
tous les objets du système,
donc la gestion des erreurs,

00:02:28.710 --> 00:02:32.170 align:middle
quand on est un break point,
les annoncements et c'est la

00:02:32.370 --> 00:02:33.260 align:middle
racine de l'arbre d'héritage.

00:02:33.460 --> 00:02:34.640 align:middle
Vous pouvez aller voir
ce qu'il y a dans objet.

00:02:35.390 --> 00:02:38.240 align:middle
C'est ça sa responsabilité
première, c'est le comportement minimal.

00:02:39.790 --> 00:02:41.190 align:middle
Donc on revient à nos 7 points.

00:02:41.630 --> 00:02:43.440 align:middle
Chaque classe est
instance d'une Metaclass.

00:02:45.950 --> 00:02:47.860 align:middle
C'est ce qu'on avait vu dans
un cours précédemment, on a

00:02:48.060 --> 00:02:52.090 align:middle
dit une classe X, c'est
l'unique instance de la Metaclass

00:02:52.300 --> 00:02:53.610 align:middle
qui s'appelle X classe.

00:02:53.810 --> 00:02:55.780 align:middle
Eh bien c'est ce qu'on voit
OrderedCollection, la classe

00:02:56.000 --> 00:02:59.130 align:middle
OrderedCollection est instance de
la classe OrderedCollection class.

00:03:00.600 --> 00:03:03.390 align:middle
La classe,
SequenceableCollection, est instance de la

00:03:03.590 --> 00:03:04.350 align:middle
 classe SequenceableCollection class.

00:03:04.700 --> 00:03:08.800 align:middle
Object, la classe Object, est
instance de la classe Object class.

00:03:09.000 --> 00:03:10.540 align:middle
De toute façon toutes
les classes du système sont

00:03:10.740 --> 00:03:14.300 align:middle
instances d'une autre
Metaclass, qui a le même nom qu'elle,

00:03:15.370 --> 00:03:16.220 align:middle
suivie de class.

00:03:18.930 --> 00:03:21.770 align:middle
Donc les Metaclass en fait
sont créées automatiquement

00:03:22.000 --> 00:03:24.060 align:middle
par le système quand vous
créez une classe, elle sont

00:03:24.260 --> 00:03:27.790 align:middle
déjà créés, puis on envoie le message
New à la Metaclass qui crée la classe.

00:03:30.150 --> 00:03:33.580 align:middle
Donc la question, la
hiérarchie de Metaclass est

00:03:33.780 --> 00:03:35.210 align:middle
parallèle à la hiérarchie de class.

00:03:36.210 --> 00:03:38.260 align:middle
Ben oui, ça veut dire que
tout à l'heure, on avait

00:03:38.460 --> 00:03:41.760 align:middle
spécifié que
OrderedCollection est l'instance de

00:03:41.960 --> 00:03:43.680 align:middle
OrderededCollection class,
que SequenceableCollection est

00:03:44.820 --> 00:03:48.700 align:middle
instance de Sequenceable
 class, maintenant on devait

00:03:49.120 --> 00:03:50.930 align:middle
spécifier quelle est
la relation entre les 2.

00:03:51.290 --> 00:03:54.500 align:middle
Comme j'ai une relation
d'héritage ici, eh ben j'aurai

00:03:54.700 --> 00:03:55.530 align:middle
une relation d'héritage ici.

00:03:55.730 --> 00:04:00.550 align:middle
Toujours. Donc c'est pour
ça que on dit qu'on a cette

00:04:00.750 --> 00:04:03.080 align:middle
hiérarchie, ces 2
hiérarchies qui sont parallèles.

00:04:04.100 --> 00:04:06.420 align:middle
Donc qu'est-ce qui se passe, quand
est-ce qu'on utilise cette hiérarchie?

00:04:06.620 --> 00:04:08.830 align:middle
Quand j'envoie le
message "New", typiquement, à

00:04:09.030 --> 00:04:13.490 align:middle
OrderedCollection, je vais
chercher où dans la classe, je

00:04:13.690 --> 00:04:15.550 align:middle
vais sur la classe donc
OrderedCollection class, et je

00:04:15.750 --> 00:04:17.140 align:middle
cherche est-ce que
tu as redéfini New?

00:04:17.340 --> 00:04:18.330 align:middle
Oui, non. Est-ce que
tu as redéfini New?

00:04:18.530 --> 00:04:20.330 align:middle
Oui, non. Est-ce que
tu as redéfini New?

00:04:20.530 --> 00:04:21.800 align:middle
Oui, non. Et caetera, et caetera.

00:04:22.350 --> 00:04:23.110 align:middle
D'accord.

00:04:23.310 --> 00:04:27.120 align:middle
Et donc là on voit bien que
on reprend la clé que je vous

00:04:27.320 --> 00:04:29.630 align:middle
ai donnée en début de
cours, qui est, je vais d'abord,

00:04:29.830 --> 00:04:32.260 align:middle
quand j'envoie un message
je vais d'abord sur la classe

00:04:32.640 --> 00:04:34.160 align:middle
puis je suis l'héritage.

00:04:35.380 --> 00:04:38.860 align:middle
Maintenant jusque là, vous
pouvez dire bon ben OK j'ai

00:04:39.060 --> 00:04:41.260 align:middle
compris, maintenant les
questions qui nous intéressent c'est

00:04:41.550 --> 00:04:45.320 align:middle
Object class est instance de qui ?

00:04:45.520 --> 00:04:46.280 align:middle
C'est vrai ça quoi !

00:04:46.860 --> 00:04:50.070 align:middle
Et qui c'est la super
 classe de Object class.

00:04:51.050 --> 00:04:51.940 align:middle
Et qu'est-ce qui se passe ?

00:04:52.140 --> 00:04:54.090 align:middle
Est-ce que ça va marcher quand
j'envoie un message à une Metaclass.

00:04:56.260 --> 00:04:58.140 align:middle
Et est-ce que ça va marcher
quand j'envoie un message au

00:04:58.340 --> 00:04:59.160 align:middle
truc qu'il y aura ici ?

00:05:00.010 --> 00:05:01.440 align:middle
Ce sont les questions
qu'on va voir maintenant.

00:05:02.680 --> 00:05:05.410 align:middle
Donc ce que le système
dit, il dit chaque Metaclass

00:05:06.090 --> 00:05:09.820 align:middle
hérite de class ou
jusqu'à Behavior on va dire.

00:05:11.000 --> 00:05:11.880 align:middle
Donc regardons ça.

00:05:12.290 --> 00:05:16.200 align:middle
Donc on répond à la première
question "Object class c'est

00:05:16.400 --> 00:05:20.260 align:middle
une classe donc elle
hérite de class, class hérite de

00:05:20.460 --> 00:05:21.670 align:middle
 ClassDescription et Behavior.

00:05:22.170 --> 00:05:25.030 align:middle
Donc en fait dans Pharo,
si on regarde par rapport à

00:05:25.230 --> 00:05:28.840 align:middle
certains autres systèmes
comme les systèmes LISP, ils n'ont

00:05:29.040 --> 00:05:30.150 align:middle
qu'une seule classe pour
Behavior ClassDescription.

00:05:31.700 --> 00:05:33.370 align:middle
Dans Pharo, c'est
découpé parce qu'il y a de la

00:05:33.570 --> 00:05:35.120 align:middle
réutilisation, vous allez
voir que Metaclass va se

00:05:35.320 --> 00:05:37.630 align:middle
brancher sous
 ClassDescription et, donc on va réutiliser

00:05:37.830 --> 00:05:39.700 align:middle
 ClassDescription
dans 2 cas de figure.

00:05:40.000 --> 00:05:42.490 align:middle
Et ce qu'on voit, c'est que
Behavior, qui est l'essence

00:05:42.960 --> 00:05:46.580 align:middle
de ce que c'est qu'une classe,
va pointer, va hériter d'objets.

00:05:49.960 --> 00:05:52.430 align:middle
Donc là par exemple, quand
je vais envoyer un message

00:05:52.630 --> 00:05:55.940 align:middle
ici, il va se
balader comme ça jusque là.

00:05:57.310 --> 00:05:58.070 align:middle
Parce que qu'est-ce qu'il fait ?

00:05:58.270 --> 00:06:00.560 align:middle
Ben il va au niveau classe
puis il suit l'arbre d'héritage.

00:06:03.150 --> 00:06:05.930 align:middle
Donc la question de savoir
où est- ce que New est défini?

00:06:06.130 --> 00:06:10.550 align:middle
New, la méthode qui crée des
instances, elle est définie dans Behavior.

00:06:12.010 --> 00:06:15.830 align:middle
Donc quand j'envoie
le message "New" à

00:06:16.030 --> 00:06:17.560 align:middle
"OrderedCollection",
qu'est-ce qui se passe?

00:06:18.030 --> 00:06:20.400 align:middle
Je cherche dans la
 classe, première étape.

00:06:21.120 --> 00:06:22.080 align:middle
Est-ce que New est redéfini ?

00:06:22.280 --> 00:06:24.640 align:middle
Donc imaginons que New ne soit
pas redéfini dans l'héritage,

00:06:25.070 --> 00:06:27.090 align:middle
je vais parcourir toutes
les sous-classes, toutes les

00:06:27.290 --> 00:06:29.530 align:middle
super classes pardon, et
je vais arriver sur New.

00:06:30.000 --> 00:06:31.650 align:middle
Et vous vous rappelez
que le look-up c'est quoi?

00:06:31.850 --> 00:06:33.810 align:middle
C'est chercher une méthode et
l'appliquer sur le receveur.

00:06:34.010 --> 00:06:37.340 align:middle
Et donc je vais trouver la méthode
New que je vais appliquer sur qui?

00:06:37.610 --> 00:06:40.000 align:middle
Sur le receveur qui est la
 classe OrderedCollection et,

00:06:41.130 --> 00:06:43.520 align:middle
ça va me créer une
nouvelle petite instance de

00:06:43.720 --> 00:06:45.320 align:middle
OrderedCollection, donc on
va l'appeler je ne sais pas,

00:06:45.520 --> 00:06:48.000 align:middle
celle- là elle aura 3, 4 par exemple.

00:06:48.180 --> 00:06:48.940 align:middle
D'accord.

00:06:49.480 --> 00:06:50.950 align:middle
Et encore une fois, vous
voyez la clé que je vous

00:06:51.150 --> 00:06:53.160 align:middle
expliquais au début du
cours, c'est toujours la même

00:06:53.360 --> 00:06:54.870 align:middle
chose, quand j'envoie un
message je cherche dans la

00:06:55.070 --> 00:06:57.560 align:middle
 classe du receveur et je
suis l'arbre d'héritage.

00:06:58.870 --> 00:07:00.190 align:middle
Donc si on regarde, là je
ne veux pas aller trop loin

00:07:00.390 --> 00:07:02.000 align:middle
dans les détails, mais finalement
qu'est-ce que c'est le Behavior?

00:07:02.190 --> 00:07:04.680 align:middle
Behavior c'est l'essence de
ce que c'est qu'un objet qui

00:07:04.880 --> 00:07:07.790 align:middle
peut avoir des instances.
Un objet qui peut avoir des

00:07:08.000 --> 00:07:12.330 align:middle
instances, en particulier,
il doit avoir un lien de super

00:07:12.530 --> 00:07:15.110 align:middle
 classe, un dictionnaire de
méthode et une description des

00:07:15.310 --> 00:07:16.650 align:middle
instances, qu'on
appelle souvent un format.

00:07:17.000 --> 00:07:19.230 align:middle
Et puis vous pouvez
regarder dans la classe, j'ai pris

00:07:19.430 --> 00:07:21.450 align:middle
quelques-unes des méthodes,
vous avez New, basicNew, newColonn.

00:07:23.860 --> 00:07:26.290 align:middle
Alors la différence entre
new et basicNew, ce qui est

00:07:26.490 --> 00:07:28.090 align:middle
important c'est qu'il
ne faut jamais faire de

00:07:28.290 --> 00:07:32.030 align:middle
redéfinition de basicNew, ça
on l'a dit lors du cours sur

00:07:32.260 --> 00:07:35.130 align:middle
les méthodes, il ne faut
jamais en Pharo redéfinir une

00:07:35.330 --> 00:07:36.710 align:middle
méthode qui commence par
basic, parce que sinon vous ne

00:07:36.910 --> 00:07:40.530 align:middle
pourriez plus accéder à la
méthode, à la méthode originale.

00:07:41.000 --> 00:07:43.210 align:middle
Donc il y a d'autres moyens,
on peut accéder à toutes les

00:07:43.920 --> 00:07:45.210 align:middle
méthodes compilées,
ce genre de choses.

00:07:45.410 --> 00:07:48.020 align:middle
Donc ça, je vous laisse
regarder mais Behavior c'est l'essence

00:07:48.220 --> 00:07:49.210 align:middle
de ce que c'est qu'une classe.

00:07:50.490 --> 00:07:51.660 align:middle
 ClassDescription
qu'est-ce que c'est?

00:07:52.390 --> 00:07:55.210 align:middle
C'est une super classe
abstraite qui va être partagée

00:07:55.410 --> 00:07:58.200 align:middle
entre class et
metaclass et, qui ajoute des

00:07:58.400 --> 00:08:00.880 align:middle
fonctionnalités à Behavior
comme la gestion du nom des

00:08:01.080 --> 00:08:02.760 align:middle
variables d'instances,
parce qu'une classe a priori n'a

00:08:02.960 --> 00:08:04.790 align:middle
pas besoin d'être fait pour
en humain pour être exécutée,

00:08:05.070 --> 00:08:07.600 align:middle
là classDescription va
ajouter sur 2 choses: la

00:08:07.800 --> 00:08:09.420 align:middle
catégorisation des
méthodes, les méthodes c'est ce que

00:08:09.620 --> 00:08:11.150 align:middle
vous avez dans le browser,
quand vous avez le browser

00:08:11.510 --> 00:08:15.200 align:middle
avec les protocoles, on va
dire cette méthode-là elle est

00:08:15.400 --> 00:08:17.680 align:middle
stockée dans le
protocole printing par exemple.

00:08:18.260 --> 00:08:22.020 align:middle
La notion de noms aussi, la
gestion des changements et le

00:08:22.220 --> 00:08:23.430 align:middle
fait que quand vous
faites un changement, il est

00:08:23.630 --> 00:08:25.570 align:middle
enregistré dans un
fichier et caetera.

00:08:25.770 --> 00:08:27.790 align:middle
Donc après, il faut regarder
ce qu'il y a dedans, ce pas

00:08:28.000 --> 00:08:30.220 align:middle
très intéressant, mais cette
décomposition elle est faite

00:08:30.420 --> 00:08:33.670 align:middle
parce que il y a
réutilisation par ces 2 sous-classes.

00:08:35.000 --> 00:08:39.810 align:middle
Donc class, c'est la
 classe qui va représenter les

00:08:40.540 --> 00:08:41.760 align:middle
 classes qu'on manipule dans Pharo.

00:08:42.400 --> 00:08:45.170 align:middle
Vous avez par exemple la
gestion des variables partagées

00:08:45.370 --> 00:08:48.220 align:middle
qui sont des classes var,
vous avez une meilleure façon

00:08:48.420 --> 00:08:49.820 align:middle
de nommer et de compiler des choses.

00:08:50.670 --> 00:08:54.030 align:middle
Donc vous encore une fois vous
pouvez regarder dans le code.

00:08:54.470 --> 00:08:56.370 align:middle
Les classes sont des
instances de metaclass, puisqu'on l'a

00:08:56.570 --> 00:08:59.670 align:middle
dit tout à l'heure. Quand
j'ai dit que Object était

00:08:59.870 --> 00:09:03.500 align:middle
instance d'une classe, qui
s'appelle Object class et que

00:09:03.700 --> 00:09:06.000 align:middle
OrderedCollection était une
instance de OrderedCollection

00:09:06.200 --> 00:09:09.050 align:middle
 class, ça marche aussi sur
 Class, ClassDescription et

00:09:09.250 --> 00:09:11.000 align:middle
Behavior, il n'y a pas de raison.

00:09:11.680 --> 00:09:15.230 align:middle
Donc Class est une instance
de Class class, Description,

00:09:15.430 --> 00:09:17.000 align:middle
la classe Description est
qui est un instance de la

00:09:17.200 --> 00:09:19.550 align:middle
 ClassDescription class, et
Behavior est une instance de

00:09:19.750 --> 00:09:21.950 align:middle
la classe Behavior class.

00:09:22.570 --> 00:09:23.450 align:middle
Et qu'est-ce qu'on a dit ?

00:09:23.650 --> 00:09:27.020 align:middle
On a dit qu'on avait
l'héritage, que si j'ai une relation

00:09:27.220 --> 00:09:29.230 align:middle
d'héritage entre
orderedCollection et Object, je dois

00:09:29.430 --> 00:09:31.440 align:middle
avoir la même relation
d'héritage entre orderedCollection

00:09:31.640 --> 00:09:35.050 align:middle
 class et Object class, donc
je vais retrouver ce que j'ai

00:09:35.250 --> 00:09:38.060 align:middle
mis en gras sur les
transparents, je vais retrouver cet héritage.

00:09:39.140 --> 00:09:43.200 align:middle
Et donc Behavior class
hérite d'Object class.

00:09:44.290 --> 00:09:47.820 align:middle
Donc l'avant dernier point,
chaque Metaclass est instance

00:09:48.020 --> 00:09:49.850 align:middle
d'une Metaclass, parce que
la question qui se pose c'est

00:09:50.050 --> 00:09:53.800 align:middle
OK c'est très bien,
de qui est instance

00:09:55.170 --> 00:09:55.930 align:middle
OrderedCollection class.

00:09:57.020 --> 00:09:59.250 align:middle
Parce que c'est un objet,
puisque tout est objet dans Pharo.

00:10:00.420 --> 00:10:04.050 align:middle
Donc OrderedCollection class est
instance de la classe Metaclass.

00:10:06.190 --> 00:10:07.920 align:middle
Object class est
instance de Metaclass.

00:10:08.120 --> 00:10:10.250 align:middle
 Class class est instance de
Metaclass, classDescription

00:10:10.570 --> 00:10:12.550 align:middle
 class est l'instance de Metaclass.

00:10:12.770 --> 00:10:15.600 align:middle
Donc toutes les Metaclass du
système sont instance de Metaclass.

00:10:17.390 --> 00:10:19.360 align:middle
Et maintenant Metaclass
elle qu'est-ce qu'elle fait?

00:10:19.560 --> 00:10:22.160 align:middle
Elle hérite de
 ClassDescription, parce qu'elle va dire ah

00:10:22.360 --> 00:10:24.220 align:middle
ben moi je suis une classe
un peu particulière, je n'ai

00:10:24.420 --> 00:10:25.410 align:middle
qu'une seule instance en fait.

00:10:26.020 --> 00:10:29.000 align:middle
Et vous ne pouvez pas donner
mon nom parce que mon nom il

00:10:29.200 --> 00:10:31.730 align:middle
est défini par le nom de mon
instance, ce qui est un peu

00:10:31.930 --> 00:10:33.140 align:middle
barbare mais c'est comme ça.

00:10:33.700 --> 00:10:36.690 align:middle
Donc là ce qu'on voit,
c'est que OrderedCollection est

00:10:36.890 --> 00:10:38.090 align:middle
instance
d'OrderedCollection class et, que

00:10:38.290 --> 00:10:40.850 align:middle
orderedCollection class a comme
nom dans celui de son instance.

00:10:41.400 --> 00:10:43.910 align:middle
Donc chaque Metaclass
est instance de Metaclass.

00:10:45.200 --> 00:10:47.950 align:middle
Donc en fait si on regarde
dans le code, Metaclass, sa

00:10:48.150 --> 00:10:53.000 align:middle
principale responsabilité et
existence, c'est de créer, d'

00:10:53.200 --> 00:10:55.370 align:middle
initialiser une unité
instance d'elle-même.

00:10:56.140 --> 00:10:58.710 align:middle
Donc il nous reste une
seule question maintenant, à

00:10:58.910 --> 00:11:02.460 align:middle
laquelle on doit répondre
mais, c'est de qui est instance

00:11:03.060 --> 00:11:07.500 align:middle
la Metaclass? La Metaclass
elle est instance, parce que

00:11:07.700 --> 00:11:10.150 align:middle
c'est une classe comme
OrderedCollection, c'est la même

00:11:10.350 --> 00:11:13.470 align:middle
chose, elle est instance de
la classe Metaclass class.

00:11:15.000 --> 00:11:19.660 align:middle
Et si on regarde Metaclass
hérite de ClassDescription,

00:11:21.200 --> 00:11:25.270 align:middle
donc Metaclass class hérite
de ClassDescription class.

00:11:26.880 --> 00:11:29.000 align:middle
De la même manière que
j'avais OrderedCollection class

00:11:29.200 --> 00:11:33.520 align:middle
hérite de Object class car
OrderedCollection hérite de Object.

00:11:33.950 --> 00:11:38.120 align:middle
Donc ce qu'on voit, c'est
que Metaclass est instance de

00:11:38.320 --> 00:11:40.080 align:middle
Metaclass class, de la même
manière que OrderedCollection

00:11:40.280 --> 00:11:41.680 align:middle
était instance
d'OrderedCollection class.

00:11:43.640 --> 00:11:47.920 align:middle
Et maintenant, Metaclass
 class, elle, est instance de

00:11:48.120 --> 00:11:52.020 align:middle
Metaclass, de la même
manière que Class class, Object

00:11:52.220 --> 00:11:54.870 align:middle
 class et OrderedCollection
 class sont instance de Metaclass.

00:11:55.070 --> 00:11:58.250 align:middle
Ça fait un peu bizarre de
voir ce petit noyau, mais c'est

00:11:58.450 --> 00:12:00.670 align:middle
normal, c'est cohérent
avec l'ensemble de la chose.

00:12:02.120 --> 00:12:04.050 align:middle
Effectivement, vous n'en
avait pas besoin pour programmer

00:12:04.250 --> 00:12:06.570 align:middle
en Pharo, donc vous pouvez l'oublier.

00:12:06.770 --> 00:12:08.380 align:middle
Maintenant ce qui est
intéressant dans ce graphe, c'est

00:12:08.580 --> 00:12:11.050 align:middle
que la clé que je vous ai
donnée en début de cours, elle

00:12:11.250 --> 00:12:12.230 align:middle
fonctionne parfaitement dedans.

00:12:12.430 --> 00:12:14.070 align:middle
Ça veut dire qu'à chaque
fois que vous envoyez un message

00:12:14.270 --> 00:12:18.040 align:middle
à un objet, on va regarder sa
 classe et, parcourir l'arbre d'héritage.

00:12:18.240 --> 00:12:20.150 align:middle
Et là j'aimerais faire
quelques quelques exemples avec

00:12:20.350 --> 00:12:21.600 align:middle
vous commençons par le début.

00:12:21.850 --> 00:12:24.440 align:middle
J'envoie un message à cet
instance-là, qu'est-ce qui va se passer?

00:12:24.670 --> 00:12:25.430 align:middle
Je viens sur Object.

00:12:26.690 --> 00:12:31.570 align:middle
Si j'envoie un message à la
 classe, je vais aller sur la

00:12:31.770 --> 00:12:34.370 align:middle
Metaclass et je vais
remonter l'arbre d'héritage.

00:12:35.240 --> 00:12:36.000 align:middle
Comme ça.

00:12:36.200 --> 00:12:40.610 align:middle
Si j'envoie un message à une
Metaclass où est-ce que je dois chercher?

00:12:41.420 --> 00:12:43.540 align:middle
Dans mes 2 class puisque ma
Metaclass orderedCollection

00:12:43.740 --> 00:12:45.680 align:middle
 class est instance de Metaclass.

00:12:45.900 --> 00:12:48.530 align:middle
Donc je vais chercher comme ça, je
vais suivre le lien d'instanciation,

00:12:49.130 --> 00:12:52.870 align:middle
je vais remonter ici et,
là par exemple si j'ai un

00:12:53.240 --> 00:12:55.130 align:middle
message qui n'est pas
compris ou si j'ai une méthode qui

00:12:55.330 --> 00:12:56.910 align:middle
est que définie sur Object,
c'est le chemin qui le fait.

00:12:57.600 --> 00:13:01.640 align:middle
Maintenant si j'envoie un
message sur Metaclass elle-même.

00:13:01.840 --> 00:13:05.020 align:middle
J'envoie un message sur
Metaclass, où est-ce que je vais chercher?

00:13:05.400 --> 00:13:08.900 align:middle
Je vais chercher sur
Metaclass class d'abord, puis je

00:13:09.100 --> 00:13:13.310 align:middle
remonte l'arbre d'héritage. Donc là

00:13:13.880 --> 00:13:17.470 align:middle
ici, voilà, je ne vous voyez plus
et celui-là c'est le plus compliqué.

00:13:19.560 --> 00:13:21.280 align:middle
De la même manière si
j'envoie un message sur Metaclass,

00:13:21.480 --> 00:13:23.270 align:middle
celui-là il est plus
simple, si j'envoie un message sur

00:13:23.470 --> 00:13:24.690 align:middle
Metaclass class, c'est la
même chose qu'envoyer un

00:13:24.890 --> 00:13:27.780 align:middle
message sur OrderedCollection
 class, où est-ce que je vais chercher?

00:13:28.000 --> 00:13:31.270 align:middle
Je vais chercher dans
l'instance de Metaclass class, qui

00:13:31.470 --> 00:13:33.520 align:middle
est Metaclass, et donc je
vais chercher, je vais faire

00:13:33.720 --> 00:13:35.100 align:middle
exactement le même parcours
que pour OrderedCollection

00:13:35.300 --> 00:13:36.540 align:middle
 class, je vais suivre ce chemin-là.

00:13:37.230 --> 00:13:39.370 align:middle
Ce que je voulais vous
montrer avec ce graphe, c'est qu'il

00:13:39.570 --> 00:13:40.850 align:middle
est complètement cohérent en fait.

00:13:41.540 --> 00:13:45.830 align:middle
Vous ne pouvez pas avoir un
graphe incohérent, pourquoi?

00:13:46.030 --> 00:13:48.550 align:middle
Parce que la machine
virtuelle ne fait qu'une seule chose.

00:13:48.750 --> 00:13:50.460 align:middle
Quand vous envoyez un
message à un objet, il cherche dans

00:13:50.660 --> 00:13:53.300 align:middle
la classe de l'objet et
remonte l'arbre d'héritage.

00:13:53.530 --> 00:13:54.900 align:middle
Et ce graphe, qui en
fait parait complet, est

00:13:55.550 --> 00:13:58.380 align:middle
complètement uniforme par
rapport à ça et cohérent.

00:13:59.070 --> 00:14:01.000 align:middle
Donc ça, c'est ça que je
trouvais un petit peu excitant

00:14:01.200 --> 00:14:02.560 align:middle
parce que moi je me suis
posé des questions et je

00:14:02.760 --> 00:14:03.520 align:middle
trouvais ça vraiment sympa.

00:14:03.860 --> 00:14:05.780 align:middle
Donc qu'est-ce que
vous devez savoir?

00:14:06.000 --> 00:14:07.120 align:middle
Que les classes sont des
objets, qu'elles peuvent

00:14:07.320 --> 00:14:10.050 align:middle
recevoir des messages, que
le processus est exactement le

00:14:10.250 --> 00:14:12.240 align:middle
même que pour n'importe quel objet.

00:14:12.440 --> 00:14:15.080 align:middle
Alors après bien sûr avec un
petit peu la complexité qu'on

00:14:15.280 --> 00:14:17.280 align:middle
a des Metaclass qui ont une
instance unique et, qui ne

00:14:17.480 --> 00:14:18.520 align:middle
sont pas nommées explicitement.

00:14:19.470 --> 00:14:21.340 align:middle
Mais ça vous n'en avez pas
besoin pour programmer en Pharo.

