Phương thức show
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 25 trên 57.
Khi một đối tượng S4 được in ra, R gọi hàm show(). Nếu lớp không có phương thức tương ứng, R liệt kê mọi slot. Cách này chính xác nhưng dài:
setClass("Point", slots = c(x = "numeric", y = "numeric"))
p <- new("Point", x = 1, y = 2)
pĐầu ra:
An object of class "Point"
Slot "x":
[1] 1
Slot "y":
[1] 2setMethod("show", "Point", function(object) ...) tạo cách in riêng cho lớp. Phương thức này in bằng cat(), và được dùng khi in một đối tượng ở cấp cao nhất cũng như khi dùng print():
setClass("Point", slots = c(x = "numeric", y = "numeric"))
setMethod("show", "Point", function(object) {
cat("Point(", object@x, ", ", object@y, ")\n", sep = "")
})
p <- new("Point", x = 1, y = 2)
p
print(p)Đầu ra:
Point(1, 2)
Point(1, 2)Một slot có thể chứa một đối tượng S4 khác: khai báo kiểu của slot bằng tên lớp. Phương thức show() bên ngoài có thể in đối tượng bên trong bằng cách gọi show() trên đối tượng đó:
setClass("Point", slots = c(x = "numeric", y = "numeric"))
setMethod("show", "Point", function(object) cat("(", object@x, ", ", object@y, ")", sep = ""))
setClass("Line", slots = c(from = "Point", to = "Point"))
setMethod("show", "Line", function(object) {
cat("line ")
show(object@from)
cat(" -> ")
show(object@to)
cat("\n")
})
new("Line", from = new("Point", x = 0, y = 0), to = new("Point", x = 3, y = 4))Đầu ra:
line (0, 0) -> (3, 4)Lớp ảo, được khai báo bằng representation("VIRTUAL"), không thể được tạo bằng new(). Lớp này dùng làm lớp cha chung cho các lớp khác, dựa trên nội dung của chương Kế thừa S4. isVirtualClass() giúp phân biệt hai loại lớp:
setClass("Shape", representation("VIRTUAL"))
setClass("Point", slots = c(x = "numeric"))
cat(isVirtualClass("Shape"), isVirtualClass("Point"), "\n")
msg <- tryCatch(new("Shape"), error = function(e) "cannot create a Shape")
cat(msg, "\n")Đầu ra:
TRUE FALSE
cannot create a Shape Thử thách
DễĐiểm và đoạn thẳng là hai lớp S4 nằm trong hai tệp. Các lớp đã được khai báo. Hãy thêm phương thức show() cho chúng:
- Trong
Point.R: một điểm được in ra dưới dạngPoint(1, 2), theo sau là một dòng mới. - Trong
Segment.R: một đoạn thẳng được in ra dưới dạngSegment Point(1, 2) to Point(4, 6), length 5, theo sau là một dòng mới, với độ dài được làm tròn đến hai chữ số thập phân. Tự tạo văn bản cho điểm hoặc dùng hàm trợ giúp; phương thức của điểm tự in dòng mới, vì vậy đừng gọi phương thức đó ở giữa dòng in đoạn thẳng.
Code được cung cấp đọc các dòng 1,2 4,6, in điểm đầu tiên rồi đến đoạn thẳng, cả hai thông qua phương thức show().
Đặt code của bạn trong Point.R và Segment.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("Point.R")
source("Segment.R")
# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
n <- as.numeric(strsplit(line, "[ ,]")[[1]])
a <- new("Point", x = n[1], y = n[2])
b <- new("Point", x = n[3], y = n[4])
print(a)
print(new("Segment", from = a, to = b))
}
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