L’attaque des clones (2)
Si un objet R6 contient un autre objet R6 dans un ou plusieurs de ses champs, alors par défaut clone() copie ces champs R6 par référence. Pour copier ces champs R6 par valeur, la méthode clone() doit être appelée avec l’argument deep = TRUE.
a_deep_copy <- an_r6_object$clone(deep = TRUE)
Cet exercice fait partie du cours
Programmation orientée objet avec S3 et R6 en R
Instructions
Une classe R6 PowerPlug, qui décrit la prise d’alimentation du micro-ondes, a été pré-définie dans votre espace de travail. La classe MicrowaveOven a été mise à jour pour inclure un objet PowerPlug.
- Créez un objet
MicrowaveOvenet assignez-le àa_microwave_oven. - Copiez le micro-ondes dans une variable nommée
cloned_microwave_ovenen utilisant la méthodeclone()sans argument. - Copiez le micro-ondes dans une variable nommée
deep_cloned_microwave_ovenen utilisant la méthodeclone()avec l’argumentdeep = TRUE. - Modifiez le champ
typedu champpower_plugdea_microwave_ovenen"British". - Vérifiez que les champs
power_plug$typedea_microwave_ovenetcloned_microwave_ovensont identiques. - Vérifiez que les champs
power_plug$typedea_microwave_ovenetdeep_cloned_microwave_ovensont différents.
Exercice interactif pratique
Essayez cet exercice en complétant cet exemple de code.
# Create a microwave oven
a_microwave_oven <- microwave_oven_factory$new()
# Look at its power plug
a_microwave_oven$power_plug
# Copy a_microwave_oven using clone(), no args
cloned_microwave_oven <- ___
# Copy a_microwave_oven using clone(), deep = TRUE
deep_cloned_microwave_oven <- ___
# Change a_microwave_oven's power plug type
___$___ <- ___
# Check a_microwave_oven & cloned_microwave_oven same
identical(___, ___)
# Check a_microwave_oven & deep_cloned_microwave_oven different
identical(___, ___)