Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

أساليب العرض

جزء من قسم البرمجة كائنية التوجه في رحلة 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 عبر الإنترنت