Cuộc tấn công của các bản sao (2)
Nếu một đối tượng R6 chứa một (hoặc nhiều) đối tượng R6 khác trong các trường của nó, thì mặc định clone() sẽ sao chép các trường R6 theo tham chiếu. Để sao chép các trường R6 đó theo giá trị, cần gọi phương thức clone() với đối số deep = TRUE.
a_deep_copy <- an_r6_object$clone(deep = TRUE)
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 R6 PowerPlug mô tả phích cắm điện của lò vi sóng đã được định nghĩa sẵn trong không gian làm việc của bạn. Lớp MicrowaveOven đã được cập nhật để bao gồm một đối tượng PowerPlug.
- Tạo một đối tượng
MicrowaveOvenvà gán choa_microwave_oven. - Sao chép lò vi sóng vào biến
cloned_microwave_ovenbằng phương thứcclone()mà không truyền đối số. - Sao chép lò vi sóng vào biến
deep_cloned_microwave_ovenbằng phương thứcclone()với đối sốdeep = TRUE. - Đổi trường
typecủa trườngpower_plugtronga_microwave_oventhành"British". - Kiểm tra rằng các trường
power_plug$typecủaa_microwave_ovenvàcloned_microwave_ovenlà giống hệt nhau. - Kiểm tra rằng các trường
power_plug$typecủaa_microwave_ovenvàdeep_cloned_microwave_ovenlà khác nhau.
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.
# Create a microwave oven
a_microwave_oven <- microwave_oven_factory$new()
# Look at its power plug
a_microwave_oven$power_plug
# Copy a_microwave_oven using clone(), no args
cloned_microwave_oven <- ___
# Copy a_microwave_oven using clone(), deep = TRUE
deep_cloned_microwave_oven <- ___
# Change a_microwave_oven's power plug type
___$___ <- ___
# Check a_microwave_oven & cloned_microwave_oven same
identical(___, ___)
# Check a_microwave_oven & deep_cloned_microwave_oven different
identical(___, ___)