Menu
Coddy logo textTech

מתודות show

חלק מהיחידה תכנות מונחה עצמים במסלול ה-R של Coddy. שיעור 25 מתוך 57.

כאשר מדפיסים אובייקט S4, R קוראת לפונקציה show(). ללא מתודה למחלקה, היא מציגה את כל המשבצות, וזה נכון אך ארוך:

setClass("Point", slots = c(x = "numeric", y = "numeric"))
p <- new("Point", x = 1, y = 2)
p

פלט:

An object of class "Point"
Slot "x":
[1] 1

Slot "y":
[1] 2

setMethod("show", "Point", function(object) ...) מעניק למחלקה הדפסה משלה. המתודה מדפיסה באמצעות cat(), ומשתמשים בה גם כשאובייקט מודפס ברמה העליונה וגם על ידי 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)

פלט:

Point(1, 2)
Point(1, 2)

משבצת יכולה להכיל אובייקט S4 נוסף: יש להצהיר על הסוג שלה באמצעות שם המחלקה. המתודה החיצונית show() יכולה להדפיס את האובייקט הפנימי באמצעות קריאה ל-show() עליו:

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))

פלט:

line (0, 0) -> (3, 4)

מחלקה וירטואלית, המוצהרת באמצעות representation("VIRTUAL"), אי אפשר ליצור בעזרת new(). היא קיימת כדי להיות מחלקת־אב משותפת למחלקות אחרות, שעליה מתבסס פרק הירושה של S4. isVirtualClass() מבחינה בין שני הסוגים:

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")

פלט:

TRUE FALSE 
cannot create a Shape 
challenge icon

אתגר

קל

נקודות וקטעים הם שתי מחלקות S4 בשני קבצים. המחלקות מוגדרות. הוסיפו להן את המתודות show():

  • ב-Point.R: נקודה מודפסת בתור Point(1, 2) ואחריה שורה חדשה.
  • ב-Segment.R: קטע מודפס בתור Segment Point(1, 2) to Point(4, 6), length 5 ואחריו שורה חדשה, כשהאורך מעוגל לשתי ספרות עשרוניות. בנו בעצמכם את הטקסט של הנקודה או השתמשו בפונקציית עזר; המתודה של הנקודה מדפיסה שורה חדשה משלה, לכן אל תקראו לה באמצע השורה של הקטע.

הקוד שסופק קורא שורות 1,2 4,6, מדפיס את הנקודה הראשונה ולאחר מכן את הקטע, שניהם באמצעות המתודות show() שלהם.

הקוד שלכם ייכנס ל-Point.R ול-Segment.R. הקובץ main.R מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.

נסו בעצמכם

source("Point.R")
source("Segment.R")

# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
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 iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר R אונליין