1 00:00:07,670 --> 00:00:11,800 Bonjour à tous. Bienvenue dans la séquence 1 de cette 2 00:00:12,000 --> 00:00:15,800 semaine 4, semaine dans laquelle nous allons couvrir les 3 00:00:16,000 --> 00:00:20,660 aspects d'héritage en Pharo, le mécanisme de LookUp et 4 00:00:20,860 --> 00:00:21,780 du développement Web. 5 00:00:22,670 --> 00:00:26,830 Dans cette première séquence, nous allons introduire les 6 00:00:27,030 --> 00:00:29,000 notions d'héritage. 7 00:00:29,540 --> 00:00:32,700 Vous verrez que ces notions sont très proches de la 8 00:00:32,900 --> 00:00:36,810 notion d'héritage dans d'autres langages à classes, notamment Java. 9 00:00:37,190 --> 00:00:39,340 Je vous conseille quand même de regarder, même si vous 10 00:00:39,540 --> 00:00:41,100 êtes familiarisés avec ces notions, car nous allons 11 00:00:41,300 --> 00:00:46,250 introduire du vocabulaire et une représentation graphique 12 00:00:46,450 --> 00:00:49,170 qu'on va réutiliser ensuite dans tous les slides et 13 00:00:49,370 --> 00:00:50,790 toutes les séquences qui vont suivre. 14 00:00:51,270 --> 00:00:53,300 Alors dans cette séquence nous allons couvrir, qu'est-ce 15 00:00:53,500 --> 00:00:55,610 que l'héritage et comment l'utiliser. 16 00:00:56,310 --> 00:00:58,680 Vous pouvez voir, sur la droite, une représentation de 2 17 00:00:58,880 --> 00:01:02,900 classes: la classe Rectangle, avec tout d'abord son nom, 18 00:01:03,930 --> 00:01:05,120 ses variables d'instance et ses méthodes. 19 00:01:07,830 --> 00:01:10,330 En-dessous la même chose, le nom de la classe 20 00:01:10,530 --> 00:01:13,710 ColoredRectangle, ses variables d'instance, ses méthodes. 21 00:01:16,840 --> 00:01:19,620 La flèche verticale ici, on voit que c'est un triangle 22 00:01:20,080 --> 00:01:24,480 vide comme tête de flèche, indique une relation d'héritage. 23 00:01:24,680 --> 00:01:28,890 Donc la sous-classe ColoredRectangle hérite de la classe Rectangle. 24 00:01:29,910 --> 00:01:33,230 La classe ColoredRectangle, les sous-classes en général 25 00:01:33,430 --> 00:01:37,390 raffinent le comportement et l'état de leurs super classes. 26 00:01:38,080 --> 00:01:40,650 Une sous-classe, comme ici ColoredRectangle, peut ajouter 27 00:01:40,950 --> 00:01:43,880 de l'état et du comportement à sa super classe. 28 00:01:45,190 --> 00:01:49,300 Donc là, la classe ColoredRectangle, elle ajoute de l'état 29 00:01:49,550 --> 00:01:52,590 sous la forme de 2 variables d'instance, color 30 00:01:55,340 --> 00:01:57,380 et borderedColor, et une méthode, la méthode color. 31 00:01:58,180 --> 00:02:03,140 Toutes les classes héritent, à un moment ou à un autre 32 00:02:03,340 --> 00:02:04,230 de la classe object. 33 00:02:04,610 --> 00:02:06,140 En fait ce n'est pas tout à fait exact. 34 00:02:06,530 --> 00:02:09,450 Toutes les classes, on est sûr qu'elles héritent de la classe ProtoObject. 35 00:02:10,340 --> 00:02:13,570 Cependant la classe Proto Object, c'est plus un détail 36 00:02:13,770 --> 00:02:16,510 qui va servir dans des cas extrêmement précis et donc 37 00:02:16,830 --> 00:02:19,500 dans le reste de ce cours nous dirons que toutes les 38 00:02:19,700 --> 00:02:21,310 classes héritent de object, et ça nous suffira pour 39 00:02:21,510 --> 00:02:24,030 comprendre l'ensemble des mécanismes de Pharo. 40 00:02:24,230 --> 00:02:27,050 La classe ProtoObject étant laissée dans certains cas 41 00:02:27,250 --> 00:02:29,910 vraiment très spécifiques. Et il y a peu de chances que 42 00:02:30,110 --> 00:02:33,580 vous en ayez besoin si vous êtes seulement en train d'apprendre Pharo. 43 00:02:34,390 --> 00:02:37,540 Alors l'héritage se comporte de 2 façons différentes 44 00:02:37,740 --> 00:02:41,040 suivant que c'est l'héritage de l'état ou l'héritage du comportement. 45 00:02:41,950 --> 00:02:43,790 L'héritage de l'état est statique. 46 00:02:44,030 --> 00:02:46,640 Ça signifie qu'au moment où on va créer la sous-classe, 47 00:02:47,800 --> 00:02:51,250 dans la sous-classe on va savoir exactement quelles sont 48 00:02:51,530 --> 00:02:53,720 l'ensemble de ces variables d'instances. 49 00:02:54,470 --> 00:02:56,620 Par contre pour le comportement, on va faire ça 50 00:02:56,820 --> 00:02:58,380 dynamiquement, c'est-à-dire que pendant l'exécution du 51 00:02:58,580 --> 00:03:00,940 programme on va regarder quelles sont les méthodes 52 00:03:01,140 --> 00:03:02,710 définies dans les sous-classes et dans les super classes. 53 00:03:03,500 --> 00:03:06,630 Donc au niveau des variables d'instance, l'héritage des 54 00:03:06,830 --> 00:03:08,700 variables d'instance se fait à la création de la sous-classe. 55 00:03:09,320 --> 00:03:14,000 Donc à la création de la sous-classe, on va prendre les 56 00:03:14,530 --> 00:03:17,290 variables d'instance définies dans la sous-classe, donc 57 00:03:17,490 --> 00:03:22,300 ici color et border color, et on va faire l' 58 00:03:22,500 --> 00:03:26,390 union avec toutes les variables d'instance définies dans 59 00:03:26,590 --> 00:03:28,950 la super classe, dans la super classe de la super classe, 60 00:03:29,210 --> 00:03:31,180 et caetera jusqu'à remonter à object. 61 00:03:34,170 --> 00:03:36,000 Donc ici les variables d'instance de ColoredRectangle 62 00:03:37,020 --> 00:03:40,250 seront Width height color et border color. 63 00:03:41,470 --> 00:03:43,540 Pour le comportement le mécanisme est complètement 64 00:03:43,740 --> 00:03:47,050 différent, et plusieurs des séquences qui vont suivre 65 00:03:48,020 --> 00:03:50,280 vont présenter exactement comment ça se passe. 66 00:03:51,000 --> 00:03:54,650 Globalement, l'héritage de comportement se fait à l'exécution. 67 00:03:55,470 --> 00:03:59,420 C'est-à-dire que lorsqu'on envoie un message à un objet, 68 00:04:00,240 --> 00:04:03,660 la méthode correspondante va être recherchée dans la hiérarchie de classes. 69 00:04:04,420 --> 00:04:08,770 Donc là, si j'envoie un message à ColoredRectangle, le 70 00:04:09,000 --> 00:04:12,890 message Area par exemple, on va le chercher 71 00:04:13,840 --> 00:04:16,650 dans sa classe, on va chercher la méthode correspondante 72 00:04:16,850 --> 00:04:18,320 dans la classe de A color rectangle. 73 00:04:18,520 --> 00:04:23,270 On ne trouve pas la méthode Area donc on remonte 74 00:04:23,590 --> 00:04:26,650 dans la super classe, on cherche la méthode Area, on la 75 00:04:26,850 --> 00:04:29,080 trouve, c'est celle-ci qui est sélectionnée qui va être exécutée. 76 00:04:30,080 --> 00:04:30,940 Alors pour résumer. 77 00:04:31,520 --> 00:04:35,630 L'héritage, donc cette notion de sous-classe et de super 78 00:04:35,830 --> 00:04:37,700 classe, permet à une sous-classe de raffiner le 79 00:04:37,900 --> 00:04:41,250 comportement de sa super classe et de l'étendre. 80 00:04:42,200 --> 00:04:45,800 La sous-classe peut aussi étendre, c'est-à-dire ajouter 81 00:04:46,060 --> 00:04:47,620 de l'état à sa super classe. 82 00:04:48,510 --> 00:04:51,190 Pharo a un modèle d'héritage simple, donc une classe a 83 00:04:51,390 --> 00:04:52,640 une et une seule super classe. 84 00:04:52,960 --> 00:04:55,110 Il est possible de faire une sorte d'héritage multiple 85 00:04:55,310 --> 00:04:58,050 face à la notion de trait, mais nous n'aborderons pas cette notion ici. 86 00:04:59,010 --> 00:05:01,830 En haut de la hiérarchie on trouve object et aussi la 87 00:05:02,030 --> 00:05:04,920 classe ProtoObject, mais on ne rentrera pas dans ce détail. 88 00:05:05,890 --> 00:05:09,400 L'héritage d'état est statique, c'est-à-dire qu'il se 89 00:05:09,600 --> 00:05:13,080 fait lorsque la sous-classe est définie, tandis que l'héritage 90 00:05:13,280 --> 00:05:15,240 de comportement est dynamique, il se fait à l'exécution 91 00:05:15,440 --> 00:05:18,030 du programme chaque fois qu'on envoie un message à un objet.