Bắt đầu ngayBắt đầu miễn phí

Bắt đầu từ điều quan trọng nhất

Có một phương thức công khai đặc biệt tên là initialize() (lưu ý cách viết theo tiếng Anh Mỹ). Phương thức này không được người dùng gọi trực tiếp. Thay vào đó, nó được tự động gọi khi một đối tượng được tạo; tức là khi người dùng gọi new().

initialize() cho phép bạn đặt giá trị cho các private field khi tạo một đối tượng R6. Mẫu của một hàm initialize() như sau:

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
      }
    }
  )
)

Lưu ý cách dùng missing() (docs). Hàm này trả về TRUE nếu một đối số không được truyền trong lời gọi hàm.

Các đối số truyền cho phương thức new() của factory sẽ được chuyển cho initialize().

a_thing <- thing_factory$new(
  a_field = "a different value", 
  another_field = 456
)

Bài tập này là một phần của khóa học

Lập trình hướng đối tượng với S3 và R6 trong R

Xem khóa học

Hướng dẫn bài tập

Một factory cho lò vi sóng đã được định nghĩa một phần cho bạn.

  • Thêm một phương thức public tên initialize(). Phương thức này cần cho phép người dùng đặt các field power_rating_wattsdoor_is_open khi đối tượng được tạo.
    • Các đối số nên là power_rating_wattsdoor_is_open.
    • Trong thân phương thức initialize(), với mỗi đối số, nếu nó không missing() (docs), thì gán vào private field tương ứng.
  • Tạo một đối tượng lò vi sóng với công suất 650 watt và cửa đang mở.
    • Gọi phương thức new() của microwave_oven_factory.
    • Truyền các đối số power_rating_watts = 650door_is_open = TRUE vào new().
    • Gán kết quả cho a_microwave_oven.

Bài tập tương tác thực hành trực tiếp

Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.

# 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 <- ___
Chỉnh sửa và Chạy Mã