1 00:00:07,000 --> 00:00:11,880 Salut à tous. Dans ce cours, on va commencer à voir si 2 00:00:12,080 --> 00:00:14,710 finalement vous avez bien compris ce qu'on a dit dans les autres cours. 3 00:00:14,910 --> 00:00:18,250 En particulier sur super, là l'objectif est de vous faire 4 00:00:18,450 --> 00:00:22,430 vraiment réfléchir et j'ai un petit test pour voir si vous avez compris. 5 00:00:23,810 --> 00:00:24,830 Qu'est-ce que vous allez apprendre ? 6 00:00:25,030 --> 00:00:26,750 Normalement, vous allez repenser à ce que c'est que 7 00:00:26,950 --> 00:00:31,000 super, revoir la recherche des méthodes et réfléchir sur 8 00:00:31,200 --> 00:00:32,450 ce que c'est qu'une méthode de classe. 9 00:00:32,650 --> 00:00:34,020 Ça fait beaucoup pour un petit cours comme ça mais vous 10 00:00:34,220 --> 00:00:35,000 allez voir, c'est assez sympa. 11 00:00:36,950 --> 00:00:41,680 Imaginons que j'ai défini la méthode dans la classe Dice, 12 00:00:42,280 --> 00:00:44,720 que j'ai redéfini la méthode new de la manière suivante. 13 00:00:44,920 --> 00:00:48,510 J'ai écrit new et voilà le corps de la méthode, je fais 14 00:00:48,710 --> 00:00:50,720 inst : = super new. 15 00:00:50,920 --> 00:00:52,690 inst initialize return inst. 16 00:00:53,080 --> 00:00:56,380 Et moi je vais exécuter l'expression Dice new. 17 00:00:58,240 --> 00:01:00,930 Maintenant la question que je me pose et que je vous 18 00:01:01,130 --> 00:01:04,600 pose, c'est que dans cette expression à quoi correspond 19 00:01:04,800 --> 00:01:08,610 inst, à quoi correspond super et à quoi correspond super new? 20 00:01:08,810 --> 00:01:13,590 Je vous laisse 5 secondes pour y réfléchir 21 00:01:16,730 --> 00:01:18,490 et je vais vous donner quelques petites indications. 22 00:01:21,110 --> 00:01:22,920 C'est basé sur mon expérience d'enseignement. 23 00:01:23,120 --> 00:01:27,250 Non super, ce n'est pas la super classe. 24 00:01:28,430 --> 00:01:31,260 Il faut vous l'enlever de la tête celui-là. 25 00:01:31,460 --> 00:01:33,630 Non, inst n'est pas une instance de la super classe, 26 00:01:33,830 --> 00:01:35,130 parce que si c'était le cas on ne pourrait jamais créer 27 00:01:35,330 --> 00:01:37,740 des instances des classes qui sont dessous, ça serait quand même dommage. 28 00:01:38,830 --> 00:01:41,410 Qu'est-ce que c'est ? 29 00:01:41,610 --> 00:01:45,020 Finalement, ce qu'on avait dit dans le cours sur super, c'est 30 00:01:45,220 --> 00:01:46,500 que super c'est le receveur du message. 31 00:01:47,540 --> 00:01:51,270 Super pointe comme self sur le receveur du message et ça 32 00:01:51,470 --> 00:01:53,300 n'est pas spécifique à Pharo, c'est dans tous les 33 00:01:53,500 --> 00:01:58,370 langages objet comme Java, Sea sharp, Small talk. 34 00:02:00,270 --> 00:02:03,070 Le message qu'on avait dit, c'était Dice new. 35 00:02:03,820 --> 00:02:05,040 Quel est le receveur ? 36 00:02:05,240 --> 00:02:06,490 Syntaxiquement c'est clair c'est Dice. 37 00:02:07,320 --> 00:02:09,510 C'est la classe Dice. 38 00:02:10,140 --> 00:02:14,440 Normalement avec cette indication-là vous devriez comprendre un peu mieux. 39 00:02:16,530 --> 00:02:20,620 On va voir. Vous vous rappelez la recherche de la méthode 40 00:02:20,820 --> 00:02:21,580 comment ça fonctionne ? 41 00:02:21,790 --> 00:02:25,240 J'envoie un message à une instance, là coloredrectangle. 42 00:02:26,270 --> 00:02:28,850 Je cherche premièrement dans la classe de 43 00:02:29,050 --> 00:02:31,830 coloredRectangle si la méthode en question est définie, 44 00:02:32,030 --> 00:02:34,030 là elle ne l'est pas, aire n'est pas définie. 45 00:02:34,230 --> 00:02:35,580 Je la trouve ici, OK, très bien. 46 00:02:35,930 --> 00:02:40,800 J'applique la définition que j'ai trouvée sur qui 47 00:02:41,000 --> 00:02:45,080 ? Sur le receveur. Là maintenant vous devez avoir compris 48 00:02:45,280 --> 00:02:49,620 ce que fait cette méthode. Je vais chercher new dans la 49 00:02:49,820 --> 00:02:53,830 classe de la classe Dice, je le cherche et je l'applique 50 00:02:54,570 --> 00:02:56,250 sur la classe Dice. 51 00:02:57,230 --> 00:02:59,000 On va voir ça de manière plus précise. 52 00:03:00,280 --> 00:03:02,540 Ce que je vous disais, c'était que de toute façon dans 53 00:03:02,740 --> 00:03:04,270 Pharo il n'y a qu'un seul envoi de messages et il n'y a 54 00:03:04,470 --> 00:03:05,630 qu'une seule recherche de méthodes. 55 00:03:05,830 --> 00:03:09,870 Quand j'envoie un message à quelque objet que ce soit, je 56 00:03:10,070 --> 00:03:12,310 cherche toujours dans la classe, je suis toujours ce 57 00:03:12,830 --> 00:03:16,020 lien-là, puis ce lien-là. C'est toujours 2 étapes aussi. 58 00:03:16,690 --> 00:03:19,140 Qu'est-ce que ça donne dans notre système? 59 00:03:19,790 --> 00:03:21,080 Super c'est le receveur. 60 00:03:23,500 --> 00:03:25,000 Le receveur c'était la classe Dice. 61 00:03:26,320 --> 00:03:28,910 Je cherche new dans la super classe de la classe Dice 62 00:03:31,310 --> 00:03:34,710 class, là le point clé c'est que c'est Dice class et pas Dice. 63 00:03:34,930 --> 00:03:36,350 On va le voir de manière graphique juste après. 64 00:03:37,190 --> 00:03:40,730 Et une fois que j'ai trouvé ce nouveau new, je vais l'appliquer 65 00:03:41,030 --> 00:03:42,440 sur le receveur qui était la classe Dice. 66 00:03:42,640 --> 00:03:47,170 Ça va dire que new que j'ai trouvé quelque part je vais l'appliquer 67 00:03:47,370 --> 00:03:49,110 sur Dice, donc ça va créer une nouvelle instance de la 68 00:03:49,310 --> 00:03:50,580 classe Dice et ça va l'initialiser. 69 00:03:50,780 --> 00:03:55,440 Donc inst va être ma nouvelle instance, donc 1D, 70 00:03:56,460 --> 00:03:58,630 et je vais l'initialiser et je le rends. 71 00:03:59,120 --> 00:04:03,130 Si on regarde de manière graphique, quand j'envoie new à 72 00:04:03,330 --> 00:04:05,270 la classe Dice, je cherche où ? 73 00:04:05,470 --> 00:04:06,260 Dans la classe de la classe Dice. 74 00:04:06,460 --> 00:04:11,300 Donc je cherche dans Dice class, c'est là que j'ai 75 00:04:11,510 --> 00:04:12,550 ma fameuse méthode. 76 00:04:13,000 --> 00:04:14,460 Qu'est-ce que je dois faire ? 77 00:04:14,660 --> 00:04:19,350 Super, c'est la classe 78 00:04:19,550 --> 00:04:21,640 Dice, c'était le receveur la preuve, c'était écrit ici: 79 00:04:21,840 --> 00:04:23,150 j'ai envoyé le message à cet objet-là. 80 00:04:26,370 --> 00:04:30,810 Super me dit "Cherche au-dessus de la classe qui contient 81 00:04:31,010 --> 00:04:34,960 l'expression", je cherche au-dessus de la classe 82 00:04:35,880 --> 00:04:37,870 Dice class, donc je cherche ici. 83 00:04:38,070 --> 00:04:41,800 Et quelque part ici au-dessus, on verra ça plus tard, new 84 00:04:43,220 --> 00:04:44,000 est défini. 85 00:04:44,180 --> 00:04:44,940 Qu'est-ce qu'on a dit sur le lookup ? 86 00:04:45,140 --> 00:04:47,290 C'est qu'on trouve la méthode, elle est définie ici et on 87 00:04:47,490 --> 00:04:51,780 l'applique sur le receveur. Je l'applique sur Dice, 88 00:04:52,270 --> 00:04:54,030 ça va me rendre une nouvelle instance. 89 00:04:54,230 --> 00:04:55,370 Là, je vais le faire graphiquement. 90 00:04:55,570 --> 00:04:57,390 Ça me rend une petite instance: E dice. 91 00:04:57,590 --> 00:05:01,680 Cette petite instance c'est inst qui pointe dessus. 92 00:05:03,130 --> 00:05:05,150 Inst est un nouveau D. 93 00:05:06,130 --> 00:05:10,070 Ensuite, je vais envoyer le message initialize à inst et 94 00:05:10,270 --> 00:05:11,350 je le rends. 95 00:05:11,550 --> 00:05:14,140 Souvent, vous avez des problèmes avec cet exemple parce 96 00:05:14,340 --> 00:05:17,720 que cet exemple en particulier est assez retors, je le 97 00:05:17,920 --> 00:05:19,730 fais exprès pour vraiment voir si vous avez compris. 98 00:05:20,070 --> 00:05:24,470 Il va mélanger 2 choses, il va mélanger super qui est "Je 99 00:05:24,670 --> 00:05:28,680 vais chercher au-dessus de la classe qui contient l'expression super. 100 00:05:29,310 --> 00:05:31,260 Mais sachant que super c'est le receveur. 101 00:05:31,760 --> 00:05:35,190 Et en plus new, c'est une méthode qui va créer des objets 102 00:05:35,390 --> 00:05:38,240 " Là on voit qu'on est à la confluence de ces 2 choses et 103 00:05:38,440 --> 00:05:39,860 qu'en général vous avez un problème à comprendre. 104 00:05:40,480 --> 00:05:44,160 Je vous suggère de vraiment revoir cette séance parce que 105 00:05:44,360 --> 00:05:45,610 c'est vraiment important de le comprendre. 106 00:05:46,110 --> 00:05:50,800 Si je répète, super est le receveur du message qui en 107 00:05:51,000 --> 00:05:52,780 fait est la classe Dice dans ce cas-là. 108 00:05:53,410 --> 00:05:57,210 Je vais chercher au-dessus de la classe Dice class la 109 00:05:57,410 --> 00:05:59,720 méthode new que je vais appliquer sur la classe Dice, qui 110 00:05:59,920 --> 00:06:01,950 était le receveur,pour me donner une instance terminale. 111 00:06:07,040 --> 00:06:10,270 En résumé, envoyer un message c'est chercher la méthode 112 00:06:10,470 --> 00:06:12,380 dans la classe du receveur, c'est ce qu'on a fait comme d'habitude, 113 00:06:12,580 --> 00:06:14,510 comme toujours. On ne peut faire que ça en Pharo, donc c'est 114 00:06:14,710 --> 00:06:17,460 relativement simple. Maintenant, vous devez comprendre 115 00:06:17,660 --> 00:06:20,830 que super, c'est chercher au-dessus de la classe qui 116 00:06:21,030 --> 00:06:24,110 contient l'expression super, et que super c'est le 117 00:06:24,310 --> 00:06:26,000 receveur et que ça peut être une classe aussi. 118 00:06:27,000 --> 00:06:29,230 Mais là on ne va pas finir, j'ai un autre petit défi pour 119 00:06:29,430 --> 00:06:30,920 vous parce que je pense que si vous suivez le cours 120 00:06:31,120 --> 00:06:33,100 Pharo, c'est que vous voulez un peu avoir des défis. 121 00:06:34,470 --> 00:06:37,520 Imaginons que j'ai la définition suivante, j'ai une 122 00:06:37,720 --> 00:06:41,730 petite méthode qui me dit "Rends super espace class égal 123 00:06:41,930 --> 00:06:44,000 égal self class. " Qu'est-ce que ça veut dire égal égal? 124 00:06:44,320 --> 00:06:45,940 C'est l'identité de pointeur. 125 00:06:46,750 --> 00:06:50,140 En fait je demande "Est-ce que l'objet qui est rendu par 126 00:06:50,340 --> 00:06:54,080 l'expression super espace class est le même que l'objet 127 00:06:54,280 --> 00:06:55,590 qui est rendu par self égal class ?" 128 00:06:56,740 --> 00:06:59,210 Je définis cette méthode-là qui va me rendre soit vrai ou faux. 129 00:07:00,010 --> 00:07:03,750 La question que je vous pose, c'est "Quel est le résultat 130 00:07:03,950 --> 00:07:06,520 de A new foo"? Ça veut dire que je crée une nouvelle 131 00:07:06,720 --> 00:07:09,260 instance de la classe A et je lui envoie le message foo 132 00:07:09,460 --> 00:07:10,510 qui va exécuter ce message. 133 00:07:11,650 --> 00:07:14,100 Quel est le résultat et pourquoi ? 134 00:07:14,300 --> 00:07:15,450 Je vais vous laisser chercher parce que celui-là je ne 135 00:07:15,650 --> 00:07:16,460 vous donnerai pas la réponse.