1. Nauka
  2. /
  3. Kursy
  4. /
  5. Programowanie obiektowe z S3 i R6 w R

Connected

ćwiczenie

To już koniec (obiektu R6)

Podobnie jak klasa R6 może definiować publiczną metodę initialize(), która uruchamia niestandardowy kod podczas tworzenia obiektów, może też definiować publiczną metodę finalize(), uruchamianą podczas ich usuwania. Metoda finalize() nie przyjmuje żadnych argumentów. Zazwyczaj używa się jej do zamykania połączeń z bazami danych lub plikami albo do cofania efektów ubocznych – na przykład zmian globalnych parametrów options() (dokumentacja) lub parametrów graficznych par() (dokumentacja).

Szablon kodu wygląda następująco.

thing_factory <- R6Class(
  "Thing",
  public = list(
    initialize = function(x, y, z) {
      # zrób coś
    },
    finalize = function() {
      # cofnij coś
    }
  )
)

Metoda finalize() jest wywoływana, gdy obiekt zostaje usunięty z pamięci przez automatyczny mechanizm odśmiecania (garbage collector) języka R. Możesz wymusić odśmiecanie, wywołując gc() (dokumentacja).

Instrukcje 1/2

undefined XP
    1
    2

W twoim środowisku pracy jest już predefiniowana klasa MicrowaveOven o nazwie microwave_oven_factory. W bieżącym katalogu roboczym utworzono bazę danych SQLite z czasami gotowania dla różnych rodzajów potraw. Pakiet RSQLite (dokumentacja) jest już załadowany.

  • Uzupełnij definicję klasy SmartMicrowaveOven:
    • Klasa powinna dziedziczyć po microwave_oven_factory.
    • Element private powinien zawierać pole conn, początkowo ustawione na NULL.
    • Metoda initialize() powinna łączyć się z bazą danych SQLite za pomocą dbConnect(SQLite(), "cooking-times.sqlite").
    • Połączenie to należy zapisać w prywatnym polu conn.
    • Metoda finalize() powinna wyświetlać komunikat message() (dokumentacja) o treści "Disconnecting from the cooking times database.", a następnie rozłączyć się z bazą danych za pomocą dbDisconnect(private$conn).
  • Utwórz obiekt klasy SmartMicrowaveOven i przypisz go do zmiennej a_smart_microwave.
  • Wywołaj metodę get_cooking_time(), przekazując "soup" jako argument food.