1 00:00:00,440 --> 00:00:04,000 Bonjour. Donc ce cours c'est un cours vraiment avancé. 2 00:00:04,480 --> 00:00:06,830 Alors on va ouvrir le capot de Pharo et on va aller voir 3 00:00:07,030 --> 00:00:10,550 comment les classes, et toutes les relations d'instances 4 00:00:10,750 --> 00:00:15,190 entre classes sont gérées, donc c'est vraiment pour les curieux on va dire. 5 00:00:16,520 --> 00:00:18,160 Donc ce qu'il faut bien voir, c'est que vous n'en avez 6 00:00:18,360 --> 00:00:20,350 absolument pas besoin pour programmer en Pharo, la preuve 7 00:00:20,550 --> 00:00:22,820 c'est que vous avez déjà programmé plein de petits 8 00:00:23,020 --> 00:00:25,930 programmes et d'applications en Pharo, sans savoir comment ça marchait. 9 00:00:26,440 --> 00:00:28,410 Maintenant moi je me dis qu'intellectuellement je serais 10 00:00:28,610 --> 00:00:31,140 insatisfait si le cours ne me montrait pas comment ça 11 00:00:31,340 --> 00:00:32,840 fonctionne à l'intérieur. Donc par exemple, moi je veux 12 00:00:33,040 --> 00:00:35,470 savoir où est-ce que lui me définit, je veux savoir mais 13 00:00:35,670 --> 00:00:39,430 c'est quoi la classe de Metaclass et, je veux comprendre tout ce bazar. 14 00:00:39,630 --> 00:00:41,740 Donc c'est pour ça qu'on a fait ce cours, donc si vous ne 15 00:00:41,940 --> 00:00:43,620 comprenez pas en première instance vous le mettez de 16 00:00:43,820 --> 00:00:45,610 côté, ça ne vous empêchera pas de faire du Pharo, par 17 00:00:45,810 --> 00:00:49,090 contre si vous avez vraiment envie de savoir ben vous l'écoutez 18 00:00:49,290 --> 00:00:50,760 une deuxième fois ou une troisième fois si nécessaire. 19 00:00:51,730 --> 00:00:54,800 Alors maintenant, il y a une clé qui est fondamentale et 20 00:00:55,000 --> 00:00:56,210 qui est vraiment sympa, c'est ce transparent-là. 21 00:00:57,030 --> 00:00:59,280 Avec ce transparent normalement vous devez comprendre. 22 00:00:59,660 --> 00:01:01,700 L'idée de base c'est toujours la même chose; de toute 23 00:01:01,900 --> 00:01:05,360 façon on ne fait que répéter ça dans ce MOOC, c'est quand 24 00:01:05,560 --> 00:01:08,160 j'envoie un message à un objet qu'est-ce que je fais? 25 00:01:08,360 --> 00:01:11,150 vous devez le savoir depuis le temps, je suis le lien d'instanciation, 26 00:01:11,640 --> 00:01:14,090 je cherche dans la classe de l'objet et si je ne le 27 00:01:14,290 --> 00:01:15,850 trouve pas, je remonte sur l'héritage. 28 00:01:16,050 --> 00:01:17,040 Donc toujours ces 2 points. 29 00:01:17,500 --> 00:01:20,230 Premièrement je vais sur la classe, deuxièmement je regarde dans l'héritage. 30 00:01:20,430 --> 00:01:23,500 On va faire ça systématiquement, systématiquement et 31 00:01:23,700 --> 00:01:26,390 systématiquement encore dans ce cours. 32 00:01:26,950 --> 00:01:30,350 Donc les métaclasses pour les expliquer, on les explique 33 00:01:30,550 --> 00:01:32,600 en 7 points et on va les dérouler un par un vous allez 34 00:01:32,800 --> 00:01:34,890 voir, c'est relativement finalement c'est relativement simple. 35 00:01:35,770 --> 00:01:39,360 Le premier point, chaque objet est instance d'une classe, ouh! 36 00:01:40,130 --> 00:01:40,890 ça c'est dur. 37 00:01:41,180 --> 00:01:45,480 Donc là j'ai l'objet "OrderedCollection", est instance de 38 00:01:45,680 --> 00:01:48,910 la classe OrderedCollection. Voila jusque là ça va. 39 00:01:50,040 --> 00:01:53,690 Donc le deuxième point, chaque classe va hériter 40 00:01:53,890 --> 00:01:55,170 finalement de la classe objet. 41 00:01:57,110 --> 00:02:00,450 Alors là ce qu'on voit c'est que OrderedCollection hérite 42 00:02:00,650 --> 00:02:03,910 de SequenceableCollection qui hérite de Collection qui hérite de Object. 43 00:02:04,610 --> 00:02:07,370 Pour info, Eventually, pour les petits Français, ça ne 44 00:02:07,570 --> 00:02:09,700 veut pas dire éventuellement ça veut dire de manière sûre. 45 00:02:10,540 --> 00:02:15,380 C'est un faux ami. Donc voilà, on a toujours notre grappe 46 00:02:15,580 --> 00:02:18,040 d'héritage, qui va de toute façon venir pointer sur Object. 47 00:02:20,180 --> 00:02:22,250 Donc qu'est-ce que c'est finalement que la responsabilité 48 00:02:22,450 --> 00:02:23,210 de la classe Object ? 49 00:02:23,410 --> 00:02:25,760 La classe object représente le comportement commun entre 50 00:02:25,960 --> 00:02:28,380 tous les objets du système, donc la gestion des erreurs, 51 00:02:28,710 --> 00:02:32,170 quand on est un break point, les annoncements et c'est la 52 00:02:32,370 --> 00:02:33,260 racine de l'arbre d'héritage. 53 00:02:33,460 --> 00:02:34,640 Vous pouvez aller voir ce qu'il y a dans objet. 54 00:02:35,390 --> 00:02:38,240 C'est ça sa responsabilité première, c'est le comportement minimal. 55 00:02:39,790 --> 00:02:41,190 Donc on revient à nos 7 points. 56 00:02:41,630 --> 00:02:43,440 Chaque classe est instance d'une Metaclass. 57 00:02:45,950 --> 00:02:47,860 C'est ce qu'on avait vu dans un cours précédemment, on a 58 00:02:48,060 --> 00:02:52,090 dit une classe X, c'est l'unique instance de la Metaclass 59 00:02:52,300 --> 00:02:53,610 qui s'appelle X classe. 60 00:02:53,810 --> 00:02:55,780 Eh bien c'est ce qu'on voit OrderedCollection, la classe 61 00:02:56,000 --> 00:02:59,130 OrderedCollection est instance de la classe OrderedCollection class. 62 00:03:00,600 --> 00:03:03,390 La classe, SequenceableCollection, est instance de la 63 00:03:03,590 --> 00:03:04,350 classe SequenceableCollection class. 64 00:03:04,700 --> 00:03:08,800 Object, la classe Object, est instance de la classe Object class. 65 00:03:09,000 --> 00:03:10,540 De toute façon toutes les classes du système sont 66 00:03:10,740 --> 00:03:14,300 instances d'une autre Metaclass, qui a le même nom qu'elle, 67 00:03:15,370 --> 00:03:16,220 suivie de class. 68 00:03:18,930 --> 00:03:21,770 Donc les Metaclass en fait sont créées automatiquement 69 00:03:22,000 --> 00:03:24,060 par le système quand vous créez une classe, elle sont 70 00:03:24,260 --> 00:03:27,790 déjà créés, puis on envoie le message New à la Metaclass qui crée la classe. 71 00:03:30,150 --> 00:03:33,580 Donc la question, la hiérarchie de Metaclass est 72 00:03:33,780 --> 00:03:35,210 parallèle à la hiérarchie de class. 73 00:03:36,210 --> 00:03:38,260 Ben oui, ça veut dire que tout à l'heure, on avait 74 00:03:38,460 --> 00:03:41,760 spécifié que OrderedCollection est l'instance de 75 00:03:41,960 --> 00:03:43,680 OrderededCollection class, que SequenceableCollection est 76 00:03:44,820 --> 00:03:48,700 instance de Sequenceable class, maintenant on devait 77 00:03:49,120 --> 00:03:50,930 spécifier quelle est la relation entre les 2. 78 00:03:51,290 --> 00:03:54,500 Comme j'ai une relation d'héritage ici, eh ben j'aurai 79 00:03:54,700 --> 00:03:55,530 une relation d'héritage ici. 80 00:03:55,730 --> 00:04:00,550 Toujours. Donc c'est pour ça que on dit qu'on a cette 81 00:04:00,750 --> 00:04:03,080 hiérarchie, ces 2 hiérarchies qui sont parallèles. 82 00:04:04,100 --> 00:04:06,420 Donc qu'est-ce qui se passe, quand est-ce qu'on utilise cette hiérarchie? 83 00:04:06,620 --> 00:04:08,830 Quand j'envoie le message "New", typiquement, à 84 00:04:09,030 --> 00:04:13,490 OrderedCollection, je vais chercher où dans la classe, je 85 00:04:13,690 --> 00:04:15,550 vais sur la classe donc OrderedCollection class, et je 86 00:04:15,750 --> 00:04:17,140 cherche est-ce que tu as redéfini New? 87 00:04:17,340 --> 00:04:18,330 Oui, non. Est-ce que tu as redéfini New? 88 00:04:18,530 --> 00:04:20,330 Oui, non. Est-ce que tu as redéfini New? 89 00:04:20,530 --> 00:04:21,800 Oui, non. Et caetera, et caetera. 90 00:04:22,350 --> 00:04:23,110 D'accord. 91 00:04:23,310 --> 00:04:27,120 Et donc là on voit bien que on reprend la clé que je vous 92 00:04:27,320 --> 00:04:29,630 ai donnée en début de cours, qui est, je vais d'abord, 93 00:04:29,830 --> 00:04:32,260 quand j'envoie un message je vais d'abord sur la classe 94 00:04:32,640 --> 00:04:34,160 puis je suis l'héritage. 95 00:04:35,380 --> 00:04:38,860 Maintenant jusque là, vous pouvez dire bon ben OK j'ai 96 00:04:39,060 --> 00:04:41,260 compris, maintenant les questions qui nous intéressent c'est 97 00:04:41,550 --> 00:04:45,320 Object class est instance de qui ? 98 00:04:45,520 --> 00:04:46,280 C'est vrai ça quoi ! 99 00:04:46,860 --> 00:04:50,070 Et qui c'est la super classe de Object class. 100 00:04:51,050 --> 00:04:51,940 Et qu'est-ce qui se passe ? 101 00:04:52,140 --> 00:04:54,090 Est-ce que ça va marcher quand j'envoie un message à une Metaclass. 102 00:04:56,260 --> 00:04:58,140 Et est-ce que ça va marcher quand j'envoie un message au 103 00:04:58,340 --> 00:04:59,160 truc qu'il y aura ici ? 104 00:05:00,010 --> 00:05:01,440 Ce sont les questions qu'on va voir maintenant. 105 00:05:02,680 --> 00:05:05,410 Donc ce que le système dit, il dit chaque Metaclass 106 00:05:06,090 --> 00:05:09,820 hérite de class ou jusqu'à Behavior on va dire. 107 00:05:11,000 --> 00:05:11,880 Donc regardons ça. 108 00:05:12,290 --> 00:05:16,200 Donc on répond à la première question "Object class c'est 109 00:05:16,400 --> 00:05:20,260 une classe donc elle hérite de class, class hérite de 110 00:05:20,460 --> 00:05:21,670 ClassDescription et Behavior. 111 00:05:22,170 --> 00:05:25,030 Donc en fait dans Pharo, si on regarde par rapport à 112 00:05:25,230 --> 00:05:28,840 certains autres systèmes comme les systèmes LISP, ils n'ont 113 00:05:29,040 --> 00:05:30,150 qu'une seule classe pour Behavior ClassDescription. 114 00:05:31,700 --> 00:05:33,370 Dans Pharo, c'est découpé parce qu'il y a de la 115 00:05:33,570 --> 00:05:35,120 réutilisation, vous allez voir que Metaclass va se 116 00:05:35,320 --> 00:05:37,630 brancher sous ClassDescription et, donc on va réutiliser 117 00:05:37,830 --> 00:05:39,700 ClassDescription dans 2 cas de figure. 118 00:05:40,000 --> 00:05:42,490 Et ce qu'on voit, c'est que Behavior, qui est l'essence 119 00:05:42,960 --> 00:05:46,580 de ce que c'est qu'une classe, va pointer, va hériter d'objets. 120 00:05:49,960 --> 00:05:52,430 Donc là par exemple, quand je vais envoyer un message 121 00:05:52,630 --> 00:05:55,940 ici, il va se balader comme ça jusque là. 122 00:05:57,310 --> 00:05:58,070 Parce que qu'est-ce qu'il fait ? 123 00:05:58,270 --> 00:06:00,560 Ben il va au niveau classe puis il suit l'arbre d'héritage. 124 00:06:03,150 --> 00:06:05,930 Donc la question de savoir où est- ce que New est défini? 125 00:06:06,130 --> 00:06:10,550 New, la méthode qui crée des instances, elle est définie dans Behavior. 126 00:06:12,010 --> 00:06:15,830 Donc quand j'envoie le message "New" à 127 00:06:16,030 --> 00:06:17,560 "OrderedCollection", qu'est-ce qui se passe? 128 00:06:18,030 --> 00:06:20,400 Je cherche dans la classe, première étape. 129 00:06:21,120 --> 00:06:22,080 Est-ce que New est redéfini ? 130 00:06:22,280 --> 00:06:24,640 Donc imaginons que New ne soit pas redéfini dans l'héritage, 131 00:06:25,070 --> 00:06:27,090 je vais parcourir toutes les sous-classes, toutes les 132 00:06:27,290 --> 00:06:29,530 super classes pardon, et je vais arriver sur New. 133 00:06:30,000 --> 00:06:31,650 Et vous vous rappelez que le look-up c'est quoi? 134 00:06:31,850 --> 00:06:33,810 C'est chercher une méthode et l'appliquer sur le receveur. 135 00:06:34,010 --> 00:06:37,340 Et donc je vais trouver la méthode New que je vais appliquer sur qui? 136 00:06:37,610 --> 00:06:40,000 Sur le receveur qui est la classe OrderedCollection et, 137 00:06:41,130 --> 00:06:43,520 ça va me créer une nouvelle petite instance de 138 00:06:43,720 --> 00:06:45,320 OrderedCollection, donc on va l'appeler je ne sais pas, 139 00:06:45,520 --> 00:06:48,000 celle- là elle aura 3, 4 par exemple. 140 00:06:48,180 --> 00:06:48,940 D'accord. 141 00:06:49,480 --> 00:06:50,950 Et encore une fois, vous voyez la clé que je vous 142 00:06:51,150 --> 00:06:53,160 expliquais au début du cours, c'est toujours la même 143 00:06:53,360 --> 00:06:54,870 chose, quand j'envoie un message je cherche dans la 144 00:06:55,070 --> 00:06:57,560 classe du receveur et je suis l'arbre d'héritage. 145 00:06:58,870 --> 00:07:00,190 Donc si on regarde, là je ne veux pas aller trop loin 146 00:07:00,390 --> 00:07:02,000 dans les détails, mais finalement qu'est-ce que c'est le Behavior? 147 00:07:02,190 --> 00:07:04,680 Behavior c'est l'essence de ce que c'est qu'un objet qui 148 00:07:04,880 --> 00:07:07,790 peut avoir des instances. Un objet qui peut avoir des 149 00:07:08,000 --> 00:07:12,330 instances, en particulier, il doit avoir un lien de super 150 00:07:12,530 --> 00:07:15,110 classe, un dictionnaire de méthode et une description des 151 00:07:15,310 --> 00:07:16,650 instances, qu'on appelle souvent un format. 152 00:07:17,000 --> 00:07:19,230 Et puis vous pouvez regarder dans la classe, j'ai pris 153 00:07:19,430 --> 00:07:21,450 quelques-unes des méthodes, vous avez New, basicNew, newColonn. 154 00:07:23,860 --> 00:07:26,290 Alors la différence entre new et basicNew, ce qui est 155 00:07:26,490 --> 00:07:28,090 important c'est qu'il ne faut jamais faire de 156 00:07:28,290 --> 00:07:32,030 redéfinition de basicNew, ça on l'a dit lors du cours sur 157 00:07:32,260 --> 00:07:35,130 les méthodes, il ne faut jamais en Pharo redéfinir une 158 00:07:35,330 --> 00:07:36,710 méthode qui commence par basic, parce que sinon vous ne 159 00:07:36,910 --> 00:07:40,530 pourriez plus accéder à la méthode, à la méthode originale. 160 00:07:41,000 --> 00:07:43,210 Donc il y a d'autres moyens, on peut accéder à toutes les 161 00:07:43,920 --> 00:07:45,210 méthodes compilées, ce genre de choses. 162 00:07:45,410 --> 00:07:48,020 Donc ça, je vous laisse regarder mais Behavior c'est l'essence 163 00:07:48,220 --> 00:07:49,210 de ce que c'est qu'une classe. 164 00:07:50,490 --> 00:07:51,660 ClassDescription qu'est-ce que c'est? 165 00:07:52,390 --> 00:07:55,210 C'est une super classe abstraite qui va être partagée 166 00:07:55,410 --> 00:07:58,200 entre class et metaclass et, qui ajoute des 167 00:07:58,400 --> 00:08:00,880 fonctionnalités à Behavior comme la gestion du nom des 168 00:08:01,080 --> 00:08:02,760 variables d'instances, parce qu'une classe a priori n'a 169 00:08:02,960 --> 00:08:04,790 pas besoin d'être fait pour en humain pour être exécutée, 170 00:08:05,070 --> 00:08:07,600 là classDescription va ajouter sur 2 choses: la 171 00:08:07,800 --> 00:08:09,420 catégorisation des méthodes, les méthodes c'est ce que 172 00:08:09,620 --> 00:08:11,150 vous avez dans le browser, quand vous avez le browser 173 00:08:11,510 --> 00:08:15,200 avec les protocoles, on va dire cette méthode-là elle est 174 00:08:15,400 --> 00:08:17,680 stockée dans le protocole printing par exemple. 175 00:08:18,260 --> 00:08:22,020 La notion de noms aussi, la gestion des changements et le 176 00:08:22,220 --> 00:08:23,430 fait que quand vous faites un changement, il est 177 00:08:23,630 --> 00:08:25,570 enregistré dans un fichier et caetera. 178 00:08:25,770 --> 00:08:27,790 Donc après, il faut regarder ce qu'il y a dedans, ce pas 179 00:08:28,000 --> 00:08:30,220 très intéressant, mais cette décomposition elle est faite 180 00:08:30,420 --> 00:08:33,670 parce que il y a réutilisation par ces 2 sous-classes. 181 00:08:35,000 --> 00:08:39,810 Donc class, c'est la classe qui va représenter les 182 00:08:40,540 --> 00:08:41,760 classes qu'on manipule dans Pharo. 183 00:08:42,400 --> 00:08:45,170 Vous avez par exemple la gestion des variables partagées 184 00:08:45,370 --> 00:08:48,220 qui sont des classes var, vous avez une meilleure façon 185 00:08:48,420 --> 00:08:49,820 de nommer et de compiler des choses. 186 00:08:50,670 --> 00:08:54,030 Donc vous encore une fois vous pouvez regarder dans le code. 187 00:08:54,470 --> 00:08:56,370 Les classes sont des instances de metaclass, puisqu'on l'a 188 00:08:56,570 --> 00:08:59,670 dit tout à l'heure. Quand j'ai dit que Object était 189 00:08:59,870 --> 00:09:03,500 instance d'une classe, qui s'appelle Object class et que 190 00:09:03,700 --> 00:09:06,000 OrderedCollection était une instance de OrderedCollection 191 00:09:06,200 --> 00:09:09,050 class, ça marche aussi sur Class, ClassDescription et 192 00:09:09,250 --> 00:09:11,000 Behavior, il n'y a pas de raison. 193 00:09:11,680 --> 00:09:15,230 Donc Class est une instance de Class class, Description, 194 00:09:15,430 --> 00:09:17,000 la classe Description est qui est un instance de la 195 00:09:17,200 --> 00:09:19,550 ClassDescription class, et Behavior est une instance de 196 00:09:19,750 --> 00:09:21,950 la classe Behavior class. 197 00:09:22,570 --> 00:09:23,450 Et qu'est-ce qu'on a dit ? 198 00:09:23,650 --> 00:09:27,020 On a dit qu'on avait l'héritage, que si j'ai une relation 199 00:09:27,220 --> 00:09:29,230 d'héritage entre orderedCollection et Object, je dois 200 00:09:29,430 --> 00:09:31,440 avoir la même relation d'héritage entre orderedCollection 201 00:09:31,640 --> 00:09:35,050 class et Object class, donc je vais retrouver ce que j'ai 202 00:09:35,250 --> 00:09:38,060 mis en gras sur les transparents, je vais retrouver cet héritage. 203 00:09:39,140 --> 00:09:43,200 Et donc Behavior class hérite d'Object class. 204 00:09:44,290 --> 00:09:47,820 Donc l'avant dernier point, chaque Metaclass est instance 205 00:09:48,020 --> 00:09:49,850 d'une Metaclass, parce que la question qui se pose c'est 206 00:09:50,050 --> 00:09:53,800 OK c'est très bien, de qui est instance 207 00:09:55,170 --> 00:09:55,930 OrderedCollection class. 208 00:09:57,020 --> 00:09:59,250 Parce que c'est un objet, puisque tout est objet dans Pharo. 209 00:10:00,420 --> 00:10:04,050 Donc OrderedCollection class est instance de la classe Metaclass. 210 00:10:06,190 --> 00:10:07,920 Object class est instance de Metaclass. 211 00:10:08,120 --> 00:10:10,250 Class class est instance de Metaclass, classDescription 212 00:10:10,570 --> 00:10:12,550 class est l'instance de Metaclass. 213 00:10:12,770 --> 00:10:15,600 Donc toutes les Metaclass du système sont instance de Metaclass. 214 00:10:17,390 --> 00:10:19,360 Et maintenant Metaclass elle qu'est-ce qu'elle fait? 215 00:10:19,560 --> 00:10:22,160 Elle hérite de ClassDescription, parce qu'elle va dire ah 216 00:10:22,360 --> 00:10:24,220 ben moi je suis une classe un peu particulière, je n'ai 217 00:10:24,420 --> 00:10:25,410 qu'une seule instance en fait. 218 00:10:26,020 --> 00:10:29,000 Et vous ne pouvez pas donner mon nom parce que mon nom il 219 00:10:29,200 --> 00:10:31,730 est défini par le nom de mon instance, ce qui est un peu 220 00:10:31,930 --> 00:10:33,140 barbare mais c'est comme ça. 221 00:10:33,700 --> 00:10:36,690 Donc là ce qu'on voit, c'est que OrderedCollection est 222 00:10:36,890 --> 00:10:38,090 instance d'OrderedCollection class et, que 223 00:10:38,290 --> 00:10:40,850 orderedCollection class a comme nom dans celui de son instance. 224 00:10:41,400 --> 00:10:43,910 Donc chaque Metaclass est instance de Metaclass. 225 00:10:45,200 --> 00:10:47,950 Donc en fait si on regarde dans le code, Metaclass, sa 226 00:10:48,150 --> 00:10:53,000 principale responsabilité et existence, c'est de créer, d' 227 00:10:53,200 --> 00:10:55,370 initialiser une unité instance d'elle-même. 228 00:10:56,140 --> 00:10:58,710 Donc il nous reste une seule question maintenant, à 229 00:10:58,910 --> 00:11:02,460 laquelle on doit répondre mais, c'est de qui est instance 230 00:11:03,060 --> 00:11:07,500 la Metaclass? La Metaclass elle est instance, parce que 231 00:11:07,700 --> 00:11:10,150 c'est une classe comme OrderedCollection, c'est la même 232 00:11:10,350 --> 00:11:13,470 chose, elle est instance de la classe Metaclass class. 233 00:11:15,000 --> 00:11:19,660 Et si on regarde Metaclass hérite de ClassDescription, 234 00:11:21,200 --> 00:11:25,270 donc Metaclass class hérite de ClassDescription class. 235 00:11:26,880 --> 00:11:29,000 De la même manière que j'avais OrderedCollection class 236 00:11:29,200 --> 00:11:33,520 hérite de Object class car OrderedCollection hérite de Object. 237 00:11:33,950 --> 00:11:38,120 Donc ce qu'on voit, c'est que Metaclass est instance de 238 00:11:38,320 --> 00:11:40,080 Metaclass class, de la même manière que OrderedCollection 239 00:11:40,280 --> 00:11:41,680 était instance d'OrderedCollection class. 240 00:11:43,640 --> 00:11:47,920 Et maintenant, Metaclass class, elle, est instance de 241 00:11:48,120 --> 00:11:52,020 Metaclass, de la même manière que Class class, Object 242 00:11:52,220 --> 00:11:54,870 class et OrderedCollection class sont instance de Metaclass. 243 00:11:55,070 --> 00:11:58,250 Ça fait un peu bizarre de voir ce petit noyau, mais c'est 244 00:11:58,450 --> 00:12:00,670 normal, c'est cohérent avec l'ensemble de la chose. 245 00:12:02,120 --> 00:12:04,050 Effectivement, vous n'en avait pas besoin pour programmer 246 00:12:04,250 --> 00:12:06,570 en Pharo, donc vous pouvez l'oublier. 247 00:12:06,770 --> 00:12:08,380 Maintenant ce qui est intéressant dans ce graphe, c'est 248 00:12:08,580 --> 00:12:11,050 que la clé que je vous ai donnée en début de cours, elle 249 00:12:11,250 --> 00:12:12,230 fonctionne parfaitement dedans. 250 00:12:12,430 --> 00:12:14,070 Ça veut dire qu'à chaque fois que vous envoyez un message 251 00:12:14,270 --> 00:12:18,040 à un objet, on va regarder sa classe et, parcourir l'arbre d'héritage. 252 00:12:18,240 --> 00:12:20,150 Et là j'aimerais faire quelques quelques exemples avec 253 00:12:20,350 --> 00:12:21,600 vous commençons par le début. 254 00:12:21,850 --> 00:12:24,440 J'envoie un message à cet instance-là, qu'est-ce qui va se passer? 255 00:12:24,670 --> 00:12:25,430 Je viens sur Object. 256 00:12:26,690 --> 00:12:31,570 Si j'envoie un message à la classe, je vais aller sur la 257 00:12:31,770 --> 00:12:34,370 Metaclass et je vais remonter l'arbre d'héritage. 258 00:12:35,240 --> 00:12:36,000 Comme ça. 259 00:12:36,200 --> 00:12:40,610 Si j'envoie un message à une Metaclass où est-ce que je dois chercher? 260 00:12:41,420 --> 00:12:43,540 Dans mes 2 class puisque ma Metaclass orderedCollection 261 00:12:43,740 --> 00:12:45,680 class est instance de Metaclass. 262 00:12:45,900 --> 00:12:48,530 Donc je vais chercher comme ça, je vais suivre le lien d'instanciation, 263 00:12:49,130 --> 00:12:52,870 je vais remonter ici et, là par exemple si j'ai un 264 00:12:53,240 --> 00:12:55,130 message qui n'est pas compris ou si j'ai une méthode qui 265 00:12:55,330 --> 00:12:56,910 est que définie sur Object, c'est le chemin qui le fait. 266 00:12:57,600 --> 00:13:01,640 Maintenant si j'envoie un message sur Metaclass elle-même. 267 00:13:01,840 --> 00:13:05,020 J'envoie un message sur Metaclass, où est-ce que je vais chercher? 268 00:13:05,400 --> 00:13:08,900 Je vais chercher sur Metaclass class d'abord, puis je 269 00:13:09,100 --> 00:13:13,310 remonte l'arbre d'héritage. Donc là 270 00:13:13,880 --> 00:13:17,470 ici, voilà, je ne vous voyez plus et celui-là c'est le plus compliqué. 271 00:13:19,560 --> 00:13:21,280 De la même manière si j'envoie un message sur Metaclass, 272 00:13:21,480 --> 00:13:23,270 celui-là il est plus simple, si j'envoie un message sur 273 00:13:23,470 --> 00:13:24,690 Metaclass class, c'est la même chose qu'envoyer un 274 00:13:24,890 --> 00:13:27,780 message sur OrderedCollection class, où est-ce que je vais chercher? 275 00:13:28,000 --> 00:13:31,270 Je vais chercher dans l'instance de Metaclass class, qui 276 00:13:31,470 --> 00:13:33,520 est Metaclass, et donc je vais chercher, je vais faire 277 00:13:33,720 --> 00:13:35,100 exactement le même parcours que pour OrderedCollection 278 00:13:35,300 --> 00:13:36,540 class, je vais suivre ce chemin-là. 279 00:13:37,230 --> 00:13:39,370 Ce que je voulais vous montrer avec ce graphe, c'est qu'il 280 00:13:39,570 --> 00:13:40,850 est complètement cohérent en fait. 281 00:13:41,540 --> 00:13:45,830 Vous ne pouvez pas avoir un graphe incohérent, pourquoi? 282 00:13:46,030 --> 00:13:48,550 Parce que la machine virtuelle ne fait qu'une seule chose. 283 00:13:48,750 --> 00:13:50,460 Quand vous envoyez un message à un objet, il cherche dans 284 00:13:50,660 --> 00:13:53,300 la classe de l'objet et remonte l'arbre d'héritage. 285 00:13:53,530 --> 00:13:54,900 Et ce graphe, qui en fait parait complet, est 286 00:13:55,550 --> 00:13:58,380 complètement uniforme par rapport à ça et cohérent. 287 00:13:59,070 --> 00:14:01,000 Donc ça, c'est ça que je trouvais un petit peu excitant 288 00:14:01,200 --> 00:14:02,560 parce que moi je me suis posé des questions et je 289 00:14:02,760 --> 00:14:03,520 trouvais ça vraiment sympa. 290 00:14:03,860 --> 00:14:05,780 Donc qu'est-ce que vous devez savoir? 291 00:14:06,000 --> 00:14:07,120 Que les classes sont des objets, qu'elles peuvent 292 00:14:07,320 --> 00:14:10,050 recevoir des messages, que le processus est exactement le 293 00:14:10,250 --> 00:14:12,240 même que pour n'importe quel objet. 294 00:14:12,440 --> 00:14:15,080 Alors après bien sûr avec un petit peu la complexité qu'on 295 00:14:15,280 --> 00:14:17,280 a des Metaclass qui ont une instance unique et, qui ne 296 00:14:17,480 --> 00:14:18,520 sont pas nommées explicitement. 297 00:14:19,470 --> 00:14:21,340 Mais ça vous n'en avez pas besoin pour programmer en Pharo.