Menu
CoddyTech

Đị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 55

Cá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)
challenge icon

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 = "")
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch R online