WEBVTT

00:00:00.500 --> 00:00:02.750 align:middle
Bonjour. On va voir
ensemble dans cette séquence une

00:00:02.950 --> 00:00:06.000 align:middle
subtilité extrêmement
intéressante que vous pouvez

00:00:06.200 --> 00:00:08.710 align:middle
appliquer dans vos
 programmes, et donc on va revenir sur

00:00:08.910 --> 00:00:11.450 align:middle
l'exemple du programme de dé.

00:00:11.840 --> 00:00:14.600 align:middle
Donc on avait défini,
souvenez-vous, dans l'exercice des

00:00:14.800 --> 00:00:18.050 align:middle
dés, donc la classe dés ici
qui permettait de définir des

00:00:18.250 --> 00:00:20.660 align:middle
instances de cette classe pour
représenter des dés de plusieurs faces.

00:00:21.020 --> 00:00:24.670 align:middle
Et on avait défini une classe
DiceHandle, donc une poignée de dés.

00:00:26.280 --> 00:00:31.080 align:middle
On avait implémenté la
méthode "+" sur la classe poignée

00:00:31.280 --> 00:00:33.310 align:middle
de dés pour additionner
des poignées de dés, et

00:00:33.510 --> 00:00:35.150 align:middle
construire une
nouvelle poignée de dés.

00:00:35.350 --> 00:00:37.290 align:middle
Je vous remontre ici
le code de cette classe.

00:00:37.920 --> 00:00:42.770 align:middle
On a " DiceHandleNew" ici,
on crée une nouvelle poignée

00:00:43.000 --> 00:00:46.950 align:middle
de dés dans laquelle on va
ajouter les dés du receveur et

00:00:47.150 --> 00:00:49.570 align:middle
les dés du paramètre, et on
va retourner cette poignée de

00:00:49.770 --> 00:00:50.580 align:middle
dés à la fin de la méthode.

00:00:53.300 --> 00:00:56.680 align:middle
Donc maintenant on va
voir dans cette séquence la

00:00:56.880 --> 00:01:00.710 align:middle
différence entre écrire
dans cette méthode "+",

00:01:00.910 --> 00:01:03.020 align:middle
"DiceHandle new" et
écrire "Self class new".

00:01:05.100 --> 00:01:07.060 align:middle
Et pourquoi une technique
est meilleure que l'autre.

00:01:08.400 --> 00:01:09.800 align:middle
Je vous montre le problème.

00:01:10.360 --> 00:01:13.320 align:middle
Le problème c'est que si
je crée une sous-classe de

00:01:13.520 --> 00:01:16.420 align:middle
"DiceHandle" qui
s'appelle "MemoDiceHandle", et que

00:01:16.620 --> 00:01:20.000 align:middle
maintenant je veux
additionner des poignées de dés de

00:01:20.200 --> 00:01:23.340 align:middle
type "Memo", donc avec la
méthode "+" qui héritait de

00:01:23.540 --> 00:01:26.320 align:middle
"DiceHandle", on voit que le
résultat que j'obtiens c'est

00:01:26.520 --> 00:01:29.000 align:middle
une instance de la
 classe "DiceHandle" et pas une

00:01:29.200 --> 00:01:30.040 align:middle
instance de la
 classe "MemoDiceHandle".

00:01:31.080 --> 00:01:31.840 align:middle
Donc ça c'est un problème.

00:01:32.040 --> 00:01:33.760 align:middle
En fait, on aimerait quand
on additionne des éléments

00:01:34.000 --> 00:01:35.810 align:middle
obtenir le même type d'éléments.

00:01:36.410 --> 00:01:38.740 align:middle
Comment faire pour implémenter ça ?

00:01:38.940 --> 00:01:43.280 align:middle
Solution 1, je vais
changer l'implémentation de la

00:01:43.480 --> 00:01:48.420 align:middle
méthode "+" sur la
 classe "DiceHandle", et on

00:01:48.620 --> 00:01:53.510 align:middle
va juste modifier ici,
rajouter cette méthode-là.

00:01:53.760 --> 00:01:56.650 align:middle
Donc, au lieu de fixer la
 classe que je veux instancier

00:01:57.010 --> 00:02:00.740 align:middle
comme étant "DiceHandle", je
vais prévoir une méthode que

00:02:00.940 --> 00:02:03.380 align:middle
j'appelle "HandleClass".
Dans "DiceHandle", elle va

00:02:03.580 --> 00:02:05.930 align:middle
retourner la classe
"DiceHandle", et dans la sous-classe

00:02:06.130 --> 00:02:08.910 align:middle
"MemoDiceHandle" ça va
retourner la classe "MemoDiceHandle".

00:02:10.500 --> 00:02:14.880 align:middle
Juste en redéfinissant cette
méthode "HandleClass", ça va

00:02:15.080 --> 00:02:19.170 align:middle
me permettre d'obtenir la bonne
instance au moment où j'additionne

00:02:19.440 --> 00:02:20.200 align:middle
des éléments.

00:02:21.750 --> 00:02:25.750 align:middle
On a bien ici, si j'exécute
le même sniped de code mais

00:02:25.950 --> 00:02:29.650 align:middle
avec des MemoDiceHandle,
une instance de MemoDiceHandle

00:02:30.720 --> 00:02:34.230 align:middle
parce que j'ai redéfini
HandleClass, la méthode

00:02:34.430 --> 00:02:35.870 align:middle
HandleClass dans la
 classe MemoDiceHandle.

00:02:36.070 --> 00:02:37.880 align:middle
Donc on bien une
instance de la sous-classe.

00:02:38.460 --> 00:02:43.040 align:middle
Donc on a bien atteint
l'objectif qu'on s'était fixé, le

00:02:43.240 --> 00:02:48.130 align:middle
problème c'est qu'il va
falloir à chaque fois qu'on

00:02:48.330 --> 00:02:52.920 align:middle
ajoute une sous-classe à
DiceHandle, redéfinir cette

00:02:53.120 --> 00:02:53.880 align:middle
méthode HandleClass.

00:02:54.080 --> 00:02:57.060 align:middle
Il ne faut pas oublier de
la redéfinir sinon la méthode

00:02:57.260 --> 00:02:59.140 align:middle
"+" ne va jamais retourner
l'instance de la bonne classe.

00:03:00.280 --> 00:03:02.590 align:middle
C'est quelque chose qui est
un peu contraignant, il faut

00:03:02.790 --> 00:03:05.100 align:middle
toujours redéfinir la méthode,
on pourrait faire beaucoup mieux.

00:03:05.650 --> 00:03:06.930 align:middle
Je vous montre la solution 2.

00:03:07.460 --> 00:03:08.750 align:middle
La solution 2 c'est la suivante.

00:03:09.230 --> 00:03:12.610 align:middle
La méthode "+" dans
DiceHandle, cette fois on va écrire

00:03:12.810 --> 00:03:13.830 align:middle
directement "SelfClass new".

00:03:17.160 --> 00:03:21.770 align:middle
Je vais demander au receveur
courant sa classe et je vais l'instancier.

00:03:22.810 --> 00:03:27.170 align:middle
Et en fait cette classe va toujours
retourner la classe du receveur courant.

00:03:27.590 --> 00:03:29.890 align:middle
Si c'est une instance
d'une sous-classe, ça va bien

00:03:30.090 --> 00:03:33.000 align:middle
retourner la bonne classe,
"MemoDiceHandle" par exemple.

00:03:33.740 --> 00:03:36.270 align:middle
Et on va bien obtenir des
instances qui sont du même type

00:03:36.470 --> 00:03:37.390 align:middle
que celui du receveur.

00:03:38.680 --> 00:03:41.830 align:middle
En conclusion, dans cette
séquence, vous avez vu que

00:03:42.790 --> 00:03:47.720 align:middle
quand on envoie le message
"+" à un "DiceHandle", si on a

00:03:47.920 --> 00:03:51.170 align:middle
fixé dans cette méthode
"+" le nom de la classe à

00:03:51.370 --> 00:03:54.050 align:middle
instancier, quelque part on
s'interdit la redéfinition,

00:03:54.250 --> 00:03:57.260 align:middle
on s'interdit le fait de
créer des sous-classes et que ça

00:03:57.510 --> 00:04:01.350 align:middle
marche toujours en
instanciant le bon objet du bon type

00:04:01.550 --> 00:04:02.330 align:middle
d'une des
sous-classes potentiellement.

00:04:03.480 --> 00:04:07.260 align:middle
Donc il vaut mieux vraiment
utiliser "SelfClass new" pour

00:04:07.460 --> 00:04:12.300 align:middle
instancier directement la classe

00:04:12.500 --> 00:04:14.240 align:middle
en fonction du type
courant du receveur.

