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
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 fieldpower_rating_wattsvàdoor_is_openkhi đối tượng được tạo.- Các đối số nên là
power_rating_wattsvàdoor_is_open. - Trong thân phương thức
initialize(), với mỗi đối số, nếu nó khôngmissing()(docs), thì gán vào private field tương ứng.
- Các đối số nên là
- Tạo một đối tượng lò vi sóng với công suất
650watt và cửa đang mở.- Gọi phương thức
new()củamicrowave_oven_factory. - Truyền các đối số
power_rating_watts = 650vàdoor_is_open = TRUEvàonew(). - Gán kết quả cho
a_microwave_oven.
- Gọi phương thức
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 <- ___