أساليب العرض
جزء من قسم البرمجة كائنية التوجه في رحلة 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] 2setMethod("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 التحدي
سهلالنقاط والقطع مستقيمان هما فئتا 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))
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات S3
التعامل مع الملفاتالقوائم باستخدام فئةدوال المُنشئأساليب الطباعة والتنسيقأدوات التحقق والمساعدةمراجعة - درجات الحرارة2S3 الدوال العامة والطرق
الدوال العامة وUseMethodالطرق الافتراضيةطرق الدوال العامة الأساسيةأساسيات NextMethodمراجعة - مساحات الأشكالتدرّب بنفسك: مترجم R عبر الإنترنت