Contrôler la puissance
Les liaisons actives peuvent aussi servir à modifier des champs privés. Dans ce cas, la fonction de liaison doit accepter un seul argument, nommé « value ».
Le modèle pour créer une liaison active en lecture/écriture est le suivant.
thing_factory <- R6Class(
"Thing",
private = list(
..a_field = "a value"
),
active = list(
a_field = function(value) {
if(missing(value)) {
private$..a_field
} else {
assert_is_a_string(value) # ou une autre assertion
private$..a_field <- value
}
}
)
)
Les valeurs sont affectées comme s’il s’agissait d’une variable de données, et non d’une fonction.
a_thing <- thing_factory$new()
a_thing$a_field <- "a new value" # et non a_thing$a_field("a new value")
Cet exercice fait partie du cours
Programmation orientée objet avec S3 et R6 en R
Instructions
Une classe de four à micro-ondes a été partiellement définie pour vous.
- Étendez la définition de la classe pour inclure un élément
active. - Ajoutez une liaison active à l’élément
activepour contrôler le niveau de puissance.- La fonction doit s’appeler
power_level_watts. - Elle doit accepter un seul argument nommé
value. - La variable privée à lire/écrire s’appelle
..power_level_watts. - Utilisez
assert_is_a_number()(docs) pour vérifier quevalueest un nombre unique. - Utilisez
assert_all_are_in_closed_range()(docs) pour vérifier quevalueest compris entre0et..power_rating_watts.
- La fonction doit s’appeler
- Créez un objet four à micro-ondes et affectez-le à
a_microwave_oven. - Récupérez le niveau de puissance.
- Essayez de définir le niveau de puissance à la valeur
"400", en tant que chaîne de caractères. - Essayez de définir le niveau de puissance à
1600. - Définissez le niveau de puissance à
400.
Exercice interactif pratique
Essayez cet exercice en complétant cet exemple de code.
# Add a binding for power rating
microwave_oven_factory <- R6Class(
"MicrowaveOven",
private = list(
..power_rating_watts = 800,
..power_level_watts = 800
),
# Add active list containing an active binding
___ = ___(
___ = ___(___) {
if(missing(___)) {
# Return the private value
___
} else {
# Assert that value is a number
___
# Assert that value is in a closed range from 0 to power rating
___
# Set the private power level to value
___ <- ___
}
}
)
)
# Make a microwave
a_microwave_oven <- ___
# Get the power level
___
# Try to set the power level to "400"
___ <- ___
# Try to set the power level to 1600 watts
___ <- ___
# Set the power level to 400 watts
___ <- ___