1
00:00:00,500 --> 00:00:02,750
Bonjour. On va voir
ensemble dans cette séquence une

2
00:00:02,950 --> 00:00:06,000
subtilité extrêmement
intéressante que vous pouvez

3
00:00:06,200 --> 00:00:08,710
appliquer dans vos
 programmes, et donc on va revenir sur

4
00:00:08,910 --> 00:00:11,450
l'exemple du programme de dé.

5
00:00:11,840 --> 00:00:14,600
Donc on avait défini,
souvenez-vous, dans l'exercice des

6
00:00:14,800 --> 00:00:18,050
dés, donc la classe dés ici
qui permettait de définir des

7
00:00:18,250 --> 00:00:20,660
instances de cette classe pour
représenter des dés de plusieurs faces.

8
00:00:21,020 --> 00:00:24,670
Et on avait défini une classe
DiceHandle, donc une poignée de dés.

9
00:00:26,280 --> 00:00:31,080
On avait implémenté la
méthode "+" sur la classe poignée

10
00:00:31,280 --> 00:00:33,310
de dés pour additionner
des poignées de dés, et

11
00:00:33,510 --> 00:00:35,150
construire une
nouvelle poignée de dés.

12
00:00:35,350 --> 00:00:37,290
Je vous remontre ici
le code de cette classe.

13
00:00:37,920 --> 00:00:42,770
On a " DiceHandleNew" ici,
on crée une nouvelle poignée

14
00:00:43,000 --> 00:00:46,950
de dés dans laquelle on va
ajouter les dés du receveur et

15
00:00:47,150 --> 00:00:49,570
les dés du paramètre, et on
va retourner cette poignée de

16
00:00:49,770 --> 00:00:50,580
dés à la fin de la méthode.

17
00:00:53,300 --> 00:00:56,680
Donc maintenant on va
voir dans cette séquence la

18
00:00:56,880 --> 00:01:00,710
différence entre écrire
dans cette méthode "+",

19
00:01:00,910 --> 00:01:03,020
"DiceHandle new" et
écrire "Self class new".

20
00:01:05,100 --> 00:01:07,060
Et pourquoi une technique
est meilleure que l'autre.

21
00:01:08,400 --> 00:01:09,800
Je vous montre le problème.

22
00:01:10,360 --> 00:01:13,320
Le problème c'est que si
je crée une sous-classe de

23
00:01:13,520 --> 00:01:16,420
"DiceHandle" qui
s'appelle "MemoDiceHandle", et que

24
00:01:16,620 --> 00:01:20,000
maintenant je veux
additionner des poignées de dés de

25
00:01:20,200 --> 00:01:23,340
type "Memo", donc avec la
méthode "+" qui héritait de

26
00:01:23,540 --> 00:01:26,320
"DiceHandle", on voit que le
résultat que j'obtiens c'est

27
00:01:26,520 --> 00:01:29,000
une instance de la
 classe "DiceHandle" et pas une

28
00:01:29,200 --> 00:01:30,040
instance de la
 classe "MemoDiceHandle".

29
00:01:31,080 --> 00:01:31,840
Donc ça c'est un problème.

30
00:01:32,040 --> 00:01:33,760
En fait, on aimerait quand
on additionne des éléments

31
00:01:34,000 --> 00:01:35,810
obtenir le même type d'éléments.

32
00:01:36,410 --> 00:01:38,740
Comment faire pour implémenter ça ?

33
00:01:38,940 --> 00:01:43,280
Solution 1, je vais
changer l'implémentation de la

34
00:01:43,480 --> 00:01:48,420
méthode "+" sur la
 classe "DiceHandle", et on

35
00:01:48,620 --> 00:01:53,510
va juste modifier ici,
rajouter cette méthode-là.

36
00:01:53,760 --> 00:01:56,650
Donc, au lieu de fixer la
 classe que je veux instancier

37
00:01:57,010 --> 00:02:00,740
comme étant "DiceHandle", je
vais prévoir une méthode que

38
00:02:00,940 --> 00:02:03,380
j'appelle "HandleClass".
Dans "DiceHandle", elle va

39
00:02:03,580 --> 00:02:05,930
retourner la classe
"DiceHandle", et dans la sous-classe

40
00:02:06,130 --> 00:02:08,910
"MemoDiceHandle" ça va
retourner la classe "MemoDiceHandle".

41
00:02:10,500 --> 00:02:14,880
Juste en redéfinissant cette
méthode "HandleClass", ça va

42
00:02:15,080 --> 00:02:19,170
me permettre d'obtenir la bonne
instance au moment où j'additionne

43
00:02:19,440 --> 00:02:20,200
des éléments.

44
00:02:21,750 --> 00:02:25,750
On a bien ici, si j'exécute
le même sniped de code mais

45
00:02:25,950 --> 00:02:29,650
avec des MemoDiceHandle,
une instance de MemoDiceHandle

46
00:02:30,720 --> 00:02:34,230
parce que j'ai redéfini
HandleClass, la méthode

47
00:02:34,430 --> 00:02:35,870
HandleClass dans la
 classe MemoDiceHandle.

48
00:02:36,070 --> 00:02:37,880
Donc on bien une
instance de la sous-classe.

49
00:02:38,460 --> 00:02:43,040
Donc on a bien atteint
l'objectif qu'on s'était fixé, le

50
00:02:43,240 --> 00:02:48,130
problème c'est qu'il va
falloir à chaque fois qu'on

51
00:02:48,330 --> 00:02:52,920
ajoute une sous-classe à
DiceHandle, redéfinir cette

52
00:02:53,120 --> 00:02:53,880
méthode HandleClass.

53
00:02:54,080 --> 00:02:57,060
Il ne faut pas oublier de
la redéfinir sinon la méthode

54
00:02:57,260 --> 00:02:59,140
"+" ne va jamais retourner
l'instance de la bonne classe.

55
00:03:00,280 --> 00:03:02,590
C'est quelque chose qui est
un peu contraignant, il faut

56
00:03:02,790 --> 00:03:05,100
toujours redéfinir la méthode,
on pourrait faire beaucoup mieux.

57
00:03:05,650 --> 00:03:06,930
Je vous montre la solution 2.

58
00:03:07,460 --> 00:03:08,750
La solution 2 c'est la suivante.

59
00:03:09,230 --> 00:03:12,610
La méthode "+" dans
DiceHandle, cette fois on va écrire

60
00:03:12,810 --> 00:03:13,830
directement "SelfClass new".

61
00:03:17,160 --> 00:03:21,770
Je vais demander au receveur
courant sa classe et je vais l'instancier.

62
00:03:22,810 --> 00:03:27,170
Et en fait cette classe va toujours
retourner la classe du receveur courant.

63
00:03:27,590 --> 00:03:29,890
Si c'est une instance
d'une sous-classe, ça va bien

64
00:03:30,090 --> 00:03:33,000
retourner la bonne classe,
"MemoDiceHandle" par exemple.

65
00:03:33,740 --> 00:03:36,270
Et on va bien obtenir des
instances qui sont du même type

66
00:03:36,470 --> 00:03:37,390
que celui du receveur.

67
00:03:38,680 --> 00:03:41,830
En conclusion, dans cette
séquence, vous avez vu que

68
00:03:42,790 --> 00:03:47,720
quand on envoie le message
"+" à un "DiceHandle", si on a

69
00:03:47,920 --> 00:03:51,170
fixé dans cette méthode
"+" le nom de la classe à

70
00:03:51,370 --> 00:03:54,050
instancier, quelque part on
s'interdit la redéfinition,

71
00:03:54,250 --> 00:03:57,260
on s'interdit le fait de
créer des sous-classes et que ça

72
00:03:57,510 --> 00:04:01,350
marche toujours en
instanciant le bon objet du bon type

73
00:04:01,550 --> 00:04:02,330
d'une des
sous-classes potentiellement.

74
00:04:03,480 --> 00:04:07,260
Donc il vaut mieux vraiment
utiliser "SelfClass new" pour

75
00:04:07,460 --> 00:04:12,300
instancier directement la classe

76
00:04:12,500 --> 00:04:14,240
en fonction du type
courant du receveur.

