1 00:00:00,520 --> 00:00:04,240 Bonjour à tous. Dans cette troisième séquence, après s'être 2 00:00:04,440 --> 00:00:08,830 intéressés à l'héritage et à self et au lookup, on va s' 3 00:00:09,030 --> 00:00:09,790 intéresser à super. 4 00:00:11,130 --> 00:00:12,690 Dans cette séquence, nous allons nous intéresser 5 00:00:12,890 --> 00:00:17,690 particulièrement à l'envoi de messages dans le cas où super est le receveur. 6 00:00:18,380 --> 00:00:19,460 Alors qu'est-ce que super ? 7 00:00:20,090 --> 00:00:23,000 Prenez quelques minutes pour vous poser la question et 8 00:00:23,200 --> 00:00:24,860 notamment répondre à ces 2 questions. 9 00:00:26,120 --> 00:00:28,330 Qu'est-ce que super représente ? 10 00:00:30,480 --> 00:00:35,310 Comment se passe l'envoi de messages quand super est le receveur? 11 00:00:35,510 --> 00:00:39,000 Ce que je vais vous dire ici, c'est pareil en Pharo et en Java. 12 00:00:39,820 --> 00:00:44,680 Dans cet exemple-là, qui est proche des exemples vus 13 00:00:44,880 --> 00:00:48,840 dans la séquence précédente, on utilise super dans une des méthodes. 14 00:00:52,640 --> 00:00:55,470 On va essayer de réfléchir un peu à ce qui se passe. 15 00:00:56,670 --> 00:01:01,370 Pour A new bar, aucune difficulté, même 16 00:01:01,570 --> 00:01:02,530 exemple que précédemment. 17 00:01:03,830 --> 00:01:08,090 Cette méthode bar est exécutée et Foo retourne 10. 18 00:01:10,380 --> 00:01:12,710 Dans le cas de B new bar, on va le faire étape par 19 00:01:15,630 --> 00:01:19,600 étape. On envoie le message bar à l'objet B new. 20 00:01:19,800 --> 00:01:24,250 L'algorithme de lookup cherche une méthode 21 00:01:24,450 --> 00:01:26,940 bar à partir de la classe de cet objet. 22 00:01:27,440 --> 00:01:31,880 La méthode bar est trouvée, elle s'exécute 23 00:01:32,210 --> 00:01:36,660 sur le receveur. Donc c'est cette méthode bar là qui est 24 00:01:36,860 --> 00:01:38,350 exécutée sur le receveur. 25 00:01:40,420 --> 00:01:44,910 Il faut maintenant que je calcule super bar, self foo et 26 00:01:45,110 --> 00:01:46,010 que je fasse la somme des 2. 27 00:01:47,140 --> 00:01:48,110 On peut faire self foo. 28 00:01:48,310 --> 00:01:52,780 Self foo envoie le message foo à l'objet 29 00:01:53,000 --> 00:01:55,580 self. Self, c'est mon B new. 30 00:01:56,020 --> 00:02:00,190 Il n'y a qu'un seul foo possible, c'est celui qui est dans la classe A. 31 00:02:01,320 --> 00:02:02,080 Self foo retourne 10. 32 00:02:04,870 --> 00:02:09,270 Super bar : super, c'est le 33 00:02:09,470 --> 00:02:13,310 receveur. Par contre, l'algorithme de lookup change en 34 00:02:13,510 --> 00:02:15,530 présence du receveur super. 35 00:02:16,730 --> 00:02:21,550 On v a chercher la méthode bar à partir de la super 36 00:02:21,750 --> 00:02:23,390 classe de là où se trouve le mot-clé super. 37 00:02:25,350 --> 00:02:29,930 Super se trouve dans la méthode bar de la classe B, donc 38 00:02:30,130 --> 00:02:34,080 on va chercher une méthode bar à partir de la super 39 00:02:34,280 --> 00:02:35,040 classe de B, c'est-à-dire A. 40 00:02:36,550 --> 00:02:40,780 On trouve cette méthode-là et c'est cette méthode-là qui est exécutée. 41 00:02:41,000 --> 00:02:43,230 Donc foo est envoyé à self. 42 00:02:43,480 --> 00:02:47,630 Self, c'est toujours le même objet, c'est toujours le receveur, c'est B new. 43 00:02:48,130 --> 00:02:53,000 Foo est donc envoyé sur l'objet initial et donc c'est ce 44 00:02:53,200 --> 00:02:57,210 foo-là qui est exécuté qui retourne 10. 45 00:02:57,410 --> 00:02:58,250 10 et 10 : 20. 46 00:03:00,380 --> 00:03:04,280 Dans le cas de C new bar, on a notre C new qui est ici 47 00:03:04,480 --> 00:03:08,950 qui est une instance de la classe C et on lui envoie le message bar. 48 00:03:09,870 --> 00:03:13,270 Bar est cherché dans la classe de C new, c'est-à-dire C. 49 00:03:14,700 --> 00:03:16,230 Il n'est pas trouvé là, il est cherché au-dessus. 50 00:03:17,550 --> 00:03:22,110 Il est trouvé là, c'est donc ce bar là qui va être exécuté. 51 00:03:23,530 --> 00:03:27,680 Ce bar là est la somme de 2 envois de messages. 52 00:03:28,720 --> 00:03:32,550 On peut commencer par le second encore une fois, on 53 00:03:32,750 --> 00:03:34,410 envoie le message foo à l'objet self. 54 00:03:34,880 --> 00:03:37,660 Self, c'est toujours mon C new qui est ici. 55 00:03:38,130 --> 00:03:39,170 J'envoie le message foo. 56 00:03:40,170 --> 00:03:41,000 Cette méthode-là est trouvée. 57 00:03:41,480 --> 00:03:45,400 50 est retourné, là j'ai 50. 58 00:03:46,490 --> 00:03:49,640 Super bar, maintenant il nous manque la première partie 59 00:03:49,840 --> 00:03:51,530 de l'addition de super bar. 60 00:03:51,730 --> 00:03:53,720 J'envoie le message bar à super. 61 00:03:53,920 --> 00:03:56,540 Super, c'est toujours le receveur mais l'algorithme de 62 00:03:56,740 --> 00:04:00,690 lookup change et va chercher bar à partir de la super 63 00:04:00,890 --> 00:04:03,930 classe de là où se trouve l'expression qui contient 64 00:04:04,130 --> 00:04:07,920 super, c'est-à-dire la méthode bar de la classe B, c'est-à-dire 65 00:04:08,130 --> 00:04:11,600 la classe B, donc on commence à chercher bar à partir de 66 00:04:11,800 --> 00:04:12,620 la super classe de B, c'est-à-dire A. 67 00:04:12,820 --> 00:04:14,700 Bar est trouvé ici. 68 00:04:14,900 --> 00:04:17,310 Ce bar là est exécuté. 69 00:04:17,650 --> 00:04:20,880 Self, c'est toujours C new, c'est toujours celui-là, 70 00:04:21,160 --> 00:04:24,040 toujours le receveur et on lui envoie le message foo. 71 00:04:24,700 --> 00:04:29,430 On tombe sur 50. Ici j'ai 50: 50 et 50, 72 00:04:30,720 --> 00:04:31,480 100. 73 00:04:31,890 --> 00:04:35,280 Dans ce slide, vous avez les détails de l'exécution de l'algorithme 74 00:04:35,590 --> 00:04:38,570 pour pouvoir réviser et retravailler cet exemple. 75 00:04:39,710 --> 00:04:44,060 Super référence toujours le receveur, c'est exactement 76 00:04:44,460 --> 00:04:47,100 comme self ou comme this en Java. 77 00:04:47,300 --> 00:04:50,100 Et pareil, super en Java, c'est comme this en Java, ça 78 00:04:50,300 --> 00:04:51,250 représente toujours le receveur. 79 00:04:53,220 --> 00:04:56,340 Par contre lorsqu'un message est envoyé à super, l'algorithme 80 00:04:56,540 --> 00:04:59,790 de lookup change et commence à chercher une méthode à 81 00:05:00,000 --> 00:05:02,920 partir de la super classe, de la classe qui contient la 82 00:05:03,120 --> 00:05:05,230 méthode en train d'être exécutée dans laquelle super se trouve. 83 00:05:06,100 --> 00:05:11,000 Self et super ont donc une différence fondamentale: self 84 00:05:11,200 --> 00:05:13,880 est dynamique tandis que super est statique. 85 00:05:14,120 --> 00:05:15,150 Qu'est-ce que je veux dire par là ? 86 00:05:17,140 --> 00:05:20,510 Je veux dire que quand foo est envoyé à self, le 87 00:05:20,710 --> 00:05:23,680 développeur n'a aucune idée de la méthode foo qui va être exécutée. 88 00:05:24,930 --> 00:05:27,950 Ça peut être le foo qui se trouve dans la même classe, 89 00:05:29,920 --> 00:05:32,860 dans une sous-classe existante ou dans une sous-classe 90 00:05:33,080 --> 00:05:37,750 qui sera créée par un autre développeur avant l'exécution du programme. 91 00:05:38,760 --> 00:05:41,880 Donc lorsque le développeur de la méthode bar écrit self 92 00:05:42,080 --> 00:05:45,140 foo, il n'a aucune idée de la méthode foo qui va être exécutée. 93 00:05:46,260 --> 00:05:48,660 C'est particulièrement pratique, ça veut dire que les 94 00:05:48,860 --> 00:05:51,330 développeurs peuvent créer de nouvelles sous-classes pour 95 00:05:51,530 --> 00:05:54,440 changer le comportement de la classe A. 96 00:05:55,500 --> 00:05:58,200 Super, à l'inverse, est statique. 97 00:05:58,910 --> 00:06:03,240 Lorsque le développeur écrit "Super foo", 98 00:06:04,070 --> 00:06:06,550 il sait quelle est la méthode foo qui sera exécutée 99 00:06:07,500 --> 00:06:09,740 lorsque le programme sera exécuté. 100 00:06:09,940 --> 00:06:14,820 Donc en écrivant ça, il sait que ça sera cette méthode 101 00:06:15,020 --> 00:06:16,210 foo-là qui sera exécutée. 102 00:06:16,890 --> 00:06:20,110 Toujours. Super est statique, à la compilation on sait 103 00:06:20,310 --> 00:06:21,330 quelle méthode sera exécutée. 104 00:06:23,200 --> 00:06:27,000 Malheureusement, certains livres se trompent dans la 105 00:06:27,200 --> 00:06:30,210 définition de super et donnent des définitions qui n'ont pas de sens. 106 00:06:31,000 --> 00:06:34,460 Voici une définition qu'on a trouvée dans un livre et 107 00:06:34,660 --> 00:06:39,400 dans cette définition-là, on nous dit que super cherche 108 00:06:40,720 --> 00:06:42,920 la méthode. Donc l'algorithme de lookup quand il voit 109 00:06:43,120 --> 00:06:46,140 super va chercher la méthode à partir de la super classe du receveur. 110 00:06:48,040 --> 00:06:50,080 Donc la super classe de la classe du receveur. 111 00:06:50,410 --> 00:06:51,680 En fait cette définition est fausse. 112 00:06:52,210 --> 00:06:55,580 Si on prend l'exemple ci-dessous, si on prend comme 113 00:06:55,780 --> 00:06:58,570 receveur AC, sa classe c'est C. 114 00:06:59,740 --> 00:07:02,750 La super classe du receveur c'est donc B. 115 00:07:04,060 --> 00:07:08,240 Et si ici, j'exécute cette partie-là 116 00:07:09,020 --> 00:07:12,120 avec la définition qui est donnée plus haut et qui est 117 00:07:12,320 --> 00:07:16,210 fausse, on enverrait le message foo 118 00:07:16,880 --> 00:07:20,720 à super, et la méthode foo qui serait exécutée, c'est la 119 00:07:20,920 --> 00:07:23,840 méthode foo qui se trouve dans la super classe de la 120 00:07:24,040 --> 00:07:27,950 classe du receveur, c'est-à-dire cette méthode foo là qui 121 00:07:28,150 --> 00:07:30,930 exécuterait ça, qui enverrait le message foo à super, qui 122 00:07:31,130 --> 00:07:33,400 exécuterait ça, et cetera. Et donc on voit ici qu'on a 123 00:07:33,600 --> 00:07:38,010 une boucle infinie, c'est bien que la définition est 124 00:07:38,210 --> 00:07:42,100 fausse parce que dans la pratique cet exemple n'est pas une boucle infinie. 125 00:07:42,300 --> 00:07:43,540 Cet exemple fonctionne parfaitement. 126 00:07:44,620 --> 00:07:47,430 Et donc la définition est juste fausse. 127 00:07:47,630 --> 00:07:51,440 Ce que de vous devez retenir: Self représente toujours 128 00:07:51,640 --> 00:07:53,710 le receveur ainsi que Super. 129 00:07:54,100 --> 00:07:58,120 Et c'est pareil en Java, This et Super représentent toujours le receveur. 130 00:07:58,940 --> 00:08:01,030 Par contre, Super change l'algorithme de lookup. 131 00:08:01,690 --> 00:08:04,450 L'algorithme de lookup va chercher une méthode 132 00:08:04,650 --> 00:08:08,100 correspondante à partir de la super classe de la classe 133 00:08:08,300 --> 00:08:12,140 qui contient la méthode, qui contient le mot-clé Super. 134 00:08:12,770 --> 00:08:16,090 Les envois de messages à Self sont dynamiques, et on peut 135 00:08:16,290 --> 00:08:19,150 s'en servir en tant que développeur pour étendre le 136 00:08:19,350 --> 00:08:21,370 comportement d'une classe existante en faisant une 137 00:08:21,570 --> 00:08:23,300 sous-classe, qui redéfinit une méthode.