Định nghĩa lớp S4
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 22 trên 57.
S4 là hệ thống đối tượng chính thức của R. setClass() khai báo một lớp có các ô lưu trữ được đặt tên cùng kiểu dữ liệu của từng ô, còn new() tạo một đối tượng. Toán tử @ đọc một ô lưu trữ:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
cat(ada@name, "is", ada@age)Đầu ra:
Ada is 36setClass() cũng trả về một hàm tạo sinh. Gán hàm này cho một tên, thường là tên lớp, rồi gọi nó như hàm khởi tạo:
Person <- setClass("Person", slots = c(name = "character", age = "numeric"))
bo <- Person(name = "Bo", age = 7)
print(bo@age + 1)
print(is(bo, "Person"))Đầu ra:
[1] 8
[1] TRUEKhác với S3, R kiểm tra các slot. Slot không xác định hoặc giá trị không đúng kiểu sẽ khiến new() dừng và báo lỗi, vì vậy đối tượng S4 luôn có cấu trúc mà lớp của nó khai báo:
setClass("Person", slots = c(name = "character", age = "numeric"))
p <- new("Person", name = "Cy", age = "ten")Đầu ra:
Error in validObject(.Object) :
invalid class “Person” object: invalid object for slot "age" in class "Person": got class "character", should be or extend class "numeric"
Calls: new -> initialize -> initialize -> validObject
Execution haltedMột slot không được chỉ định sẽ nhận giá trị rỗng thuộc kiểu của nó, chẳng hạn như character(0). prototype thiết lập các giá trị mặc định thực sự. Code cũ khai báo các slot bằng representation(), tương đương với slots:
setClass("Task", slots = c(title = "character", done = "logical"),
prototype = list(done = FALSE))
setClass("Note", representation(text = "character"))
t <- new("Task", title = "Write report")
print(t@done)
print(length(new("Note")@text))Đầu ra:
[1] FALSE
[1] 0Thử thách
DễKhai báo lớp S4 Book trong Book.R với ba slot: title và author có kiểu character, còn pages có kiểu numeric. Sau đó hoàn thiện book_label(b), hàm này đọc các slot bằng @ và trả về Dune by Frank Herbert (412 pages).
Code được cung cấp đọc các dòng title;author;pages, tạo từng quyển sách bằng new("Book", ...), in nhãn của sách, rồi in tên các slot của lớp.
Code của bạn nằm trong Book.R. Tệp 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 được cung cấp sẵn: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, ";")[[1]]
b <- new("Book", title = p[1], author = p[2], pages = as.numeric(p[3]))
cat(book_label(b), "\n", sep = "")
}
cat("slots: ", paste(slotNames("Book"), 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ẩmTự luyện tập: Trình biên dịch R online