Tĩnh điện
Các lớp R6 có thể tận dụng hành vi sao chép theo tham chiếu của environment để chia sẻ trường giữa các đối tượng. Để thiết lập, hãy định nghĩa một trường private tên là shared. Trường này cần vài dòng để định nghĩa. Nó sẽ:
- Tạo một environment mới.
- Gán các trường dùng chung vào environment đó.
- Trả về environment.
Các trường dùng chung nên được truy cập thông qua ràng buộc hoạt động (active binding). Cách hoạt động tương tự như các ràng buộc hoạt động khác bạn đã thấy, nhưng truy xuất các trường bằng tiền tố private$shared$.
R6Class(
"Thing",
private = list(
shared = {
e <- new.env()
e$a_shared_field <- 123
e
}
),
active = list(
a_shared_field = function(value) {
if(missing(value)) {
private$shared$a_shared_field
} else {
private$shared$a_shared_field <- value
}
}
)
)
Lưu ý rằng tên của ràng buộc hoạt động phải giống với tên của trường dùng chung mà bạn muốn lấy hoặc đặt; cả hai đều là a_shared_field trong ví dụ trên.
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 lớp MicrowaveOven đã được định nghĩa một phần cho bạn.
- Trong phần private của lớp
MicrowaveOven, cập nhật trường tênshared.- Trường này nên chứa ba dòng mã được bao trong dấu ngoặc nhọn
{}. - Đầu tiên gọi
new.env()(docs) để tạo một environment mới têne, sau đó … - Gán vào
emột biến tênsafety_warning, nhận giá trị"Warning. Do not try to cook metal objects.", sau đó … - Trả về environment.
- Trường này nên chứa ba dòng mã được bao trong dấu ngoặc nhọn
- Thêm một ràng buộc hoạt động tên
safety_warningđể lấy hoặc đặt trườngsafety_warningdùng chung trong private.- Định nghĩa điều này như một hàm bên trong phần
active. - Nó nhận một đối số duy nhất tên
value. - Nó sẽ lấy hoặc đặt
private$shared$safety_warning.
- Định nghĩa điều này như một hàm bên trong phần
- Tạo hai đối tượng
MicrowaveOven, lần lượt têna_microwave_ovenvàanother_microwave_oven. - Thay đổi trường
safety_warningtrêna_microwave_oventhành"Warning. If the food is too hot you may scald yourself.". - Xem trường
safety_warningtrênanother_microwave_ovenđể đảm bảo rằng nó đã được thay đổi.
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.
# Complete the class definition
microwave_oven_factory <- R6Class(
"MicrowaveOven",
private = list(
shared = {
# Create a new environment named e
___
# Assign safety_warning into e
___
# Return e
___
}
),
active = list(
# Add the safety_warning binding
safety_warning = ___(___) {
if(___(___)) {
___
} else {
___ <- ___
}
}
)
)
# Create two microwave ovens
a_microwave_oven <- ___
another_microwave_oven <- ___
# Change the safety warning for a_microwave_oven
___ <- "Warning. If the food is too hot you may scald yourself."
# Verify that the warning has change for another_microwave
___