First Thing's First
Es gibt eine spezielle öffentliche Methode namens initialize() (achte auf die amerikanische Schreibweise). Diese wird nicht direkt von der Nutzerin/dem Nutzer aufgerufen. Stattdessen wird sie automatisch aufgerufen, wenn ein Objekt erstellt wird, also wenn new() aufgerufen wird.
Mit initialize() kannst du beim Erstellen eines R6-Objekts die Werte der privaten Felder setzen. Das Muster für eine initialize()-Funktion sieht so aus:
thing_factory <- R6Class(
"Thing",
private = list(
a_field = "a value",
another_field = 123
),
public = list(
initialize = function(a_field, another_field) {
if(!missing(a_field)) {
private$a_field <- a_field
}
if(!missing(another_field)) {
private$another_field <- another_field
}
}
)
)
Beachte die Verwendung von missing() (Docs). Das ergibt TRUE, wenn ein Argument beim Funktionsaufruf nicht übergeben wurde.
Argumente der new()-Methode der Factory werden an initialize() weitergereicht.
a_thing <- thing_factory$new(
a_field = "a different value",
another_field = 456
)
Diese Übung ist Teil des Kurses
Objektorientierte Programmierung mit S3 und R6 in R
Anleitung zur Übung
Eine Mikrowellen-Factory ist teilweise für dich definiert.
- Füge eine öffentliche Methode namens
initialize()hinzu. Diese soll es der Nutzerin/dem Nutzer erlauben, beim Erstellen des Objekts die Felderpower_rating_wattsunddoor_is_openzu setzen.- Die Argumente sollten
power_rating_wattsunddoor_is_opensein. - Im Rumpf der
initialize()-Methode gilt: Für jedes Argument, wenn es nichtmissing()ist (Docs), dann soll das entsprechende private Feld gesetzt werden.
- Die Argumente sollten
- Erstelle ein Mikrowellenobjekt mit einer Leistung von
650Watt und geöffneter Tür.- Rufe die
new()-Methode vonmicrowave_oven_factoryauf. - Übergebe die Argumente
power_rating_watts = 650unddoor_is_open = TRUEannew(). - Weisen den Rückgabewert
a_microwave_ovenzu.
- Rufe die
Interaktive Übung
Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.
# Add an initialize method
microwave_oven_factory <- R6Class(
"MicrowaveOven",
private = list(
power_rating_watts = 800,
door_is_open = FALSE
),
public = list(
cook = function(time_seconds) {
Sys.sleep(time_seconds)
print("Your food is cooked!")
},
open_door = function() {
private$door_is_open <- TRUE
},
close_door = function() {
private$door_is_open <- FALSE
},
# Add initialize() method here
___ = ___(___, ___) {
if(!missing(power_rating_watts)) {
private$power_rating_watts <- power_rating_watts
}
___
}
)
)
# Make a microwave
a_microwave_oven <- ___