1. Học hỏi
  2. /
  3. Khoa Học
  4. /
  5. Lập trình hướng đối tượng với S3 và R6 trong R

Connected

Bài tập

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.

Hướng dẫn

100 XP

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ên shared.
    • 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ên e, sau đó …
    • Gán vào e một biến tên safety_warning, nhận giá trị "Warning. Do not try to cook metal objects.", sau đó …
    • Trả về environment.
  • Thêm một ràng buộc hoạt động tên safety_warning để lấy hoặc đặt trường safety_warning dù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.
  • Tạo hai đối tượng MicrowaveOven, lần lượt tên a_microwave_oven và another_microwave_oven.
  • Thay đổi trường safety_warning trên a_microwave_oven thành "Warning. If the food is too hot you may scald yourself.".
  • Xem trường safety_warning trên another_microwave_oven để đảm bảo rằng nó đã được thay đổi.