Định nghĩa lớp tham chiếu
Thuộc phần Lập trình hướng đối tượng trong hành trình R của Coddy. Bài học 37 trên 57.
Lớp tham chiếu (RC) là hệ thống của R dành cho các đối tượng thay đổi tại chỗ, như trong Java hoặc Python. setRefClass() khai báo một lớp có các trường với kiểu dữ liệu xác định và trả về một bộ tạo; $new() tạo một đối tượng, còn $ đọc và thay đổi các trường của đối tượng:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
a <- Account$new(owner = "Ada", balance = 100)
a$balance <- a$balance + 50
cat(a$owner, a$balance)Đầu ra:
Ada 150Đối tượng RC là một tham chiếu, giống như một môi trường. Gán nó cho một biến khác hoặc truyền nó vào hàm không tạo bản sao, nên thay đổi thông qua bất kỳ tên nào cũng là thay đổi đối với cùng một đối tượng:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
pay_fee <- function(acc) acc$balance <- acc$balance - 5
a <- Account$new(owner = "Ada", balance = 100)
b <- a
b$balance <- 60
pay_fee(a)
cat(a$balance, b$balance)Đầu ra:
55 55Các trường có kiểu dữ liệu. Khi gán giá trị thuộc lớp không đúng, thao tác sẽ bị từ chối và trường giữ nguyên giá trị cũ:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
a <- Account$new(owner = "Ada", balance = 100)
msg <- tryCatch({ a$balance <- "lots"; "changed" }, error = function(e) conditionMessage(e))
cat(msg, "\n")
cat(a$balance, "\n")Đầu ra:
invalid assignment for reference class field ‘balance’, should be from class “numeric” or a subclass (was class “character”)
100 Bộ tạo mô tả lớp: Account$fields() liệt kê các trường và kiểu dữ liệu của chúng. Một đối tượng được in ra mà không có phương thức show sẽ liệt kê các trường của nó; trường chưa được gán giá trị sẽ để trống:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
print(Account$fields())
Account$new(owner = "Bo")Đầu ra:
owner balance
"character" "numeric"
Reference class object of class "Account"
Field "owner":
[1] "Bo"
Field "balance":
numeric(0)Thử thách
DễKhai báo lớp tham chiếu Book trong Book.R với các trường title và author (character), cùng pages (numeric), đồng thời giữ trình tạo trong Book. Sau đó viết add_pages(book, n), hàm này cộng n vào số trang của sách ngay tại chỗ và không trả về giá trị hữu ích nào.
Code được cung cấp đọc title;author;pages, tạo sách, gán sách cho một biến thứ hai, cộng các số còn lại thông qua tên thứ hai đó, rồi in sách ban đầu và tên các trường.
Code của bạn nằm trong Book.R. main.R chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.
Tự làm thử
source("Book.R")
# Đoạn code đầu vào/đầu ra đã cho: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
p <- strsplit(input[1], ";")[[1]]
b <- Book$new(title = p[1], author = p[2], pages = as.numeric(p[3]))
alias <- b
for (n in as.numeric(input[-1])) add_pages(alias, n)
cat(b$title, " by ", b$author, ": ", b$pages, " pages\n", sep = "")
cat("fields: ", paste(names(Book$fields()), collapse = ", "), "\n", sep = "")
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Kiến thức cơ bản về S3
Làm việc với tệpDanh sách với một lớpHàm khởi tạoPhương thức in ra và định dạngTrình xác thực và hàm hỗ trợÔn tập: nhiệt độ4Tính đóng gói trong R
Closure dưới dạng đối tượngMôi trường dưới dạng đối tượngHàm truy cậpBảo vệ trạng tháiÔn tập: đồng hồ tính phí đỗ xe2S3, hàm generic và phương thức
Hàm generic và UseMethodPhương thức mặc địnhPhương thức cho hàm generic cơ sởCơ bản về NextMethodÔn tập: diện tích hình5Các lớp S4
Định nghĩa lớp S4Slot và quyền truy cậpKiểm tra tính hợp lệPhương thức showÔn tập: Danh mục sản phẩm8Lớp tham chiếu
Định nghĩa lớp tham chiếuPhương thức và cập nhật trườngNgữ nghĩa sao chépKế thừa và callSuperÔn tập: hàng đợi tác vụTự luyện tập: Trình biên dịch R online