Menu
CoddyTech

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] 2

setMethod("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 
challenge icon

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ạng Point(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ạng Segment 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))
}
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