Leistung steuern
Active Bindings können auch verwendet werden, um private Felder zu setzen. In diesem Fall sollte die Binding-Funktion ein einzelnes Argument namens "value" akzeptieren.
Das Muster zum Erstellen eines lese-/schreibfähigen Active Bindings sieht so aus.
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) # oder eine andere Assertion
private$..a_field <- value
}
}
)
)
Werte werden zugewiesen, als wäre das Binding eine Datenvariable, nicht eine Funktion.
a_thing <- thing_factory$new()
a_thing$a_field <- "a new value" # nicht a_thing$a_field("a new value")
Diese Übung ist Teil des Kurses
Objektorientierte Programmierung mit S3 und R6 in R
Anleitung zur Übung
Eine Mikrowellenofen-Klasse ist teilweise für dich definiert.
- Erweitere die Definition der Mikrowellenofen-Klasse um ein
active-Listenelement. - Füge dem
active-Element ein Active Binding hinzu, um die Leistung zu steuern.- Die Funktion soll
power_level_wattsheißen. - Sie soll ein einzelnes Argument namens
valueakzeptieren. - Die private Variable zum Lesen/Schreiben heißt
..power_level_watts. - Verwende
assert_is_a_number()(Docs), um zu prüfen, dassvalueeine einzelne Zahl ist. - Verwende
assert_all_are_in_closed_range()(Docs), um zu prüfen, dassvaluezwischen0und..power_rating_wattsliegt.
- Die Funktion soll
- Erstelle ein Mikrowellenofen-Objekt und weise es
a_microwave_ovenzu. - Lies den Leistungswert aus.
- Versuche, den Leistungswert auf den String
"400"zu setzen. - Versuche, den Leistungswert auf
1600zu setzen. - Setze den Leistungswert auf
400.
Interaktive Übung
Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.
# 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
___ <- ___