أساسيات NextMethod
جزء من قسم البرمجة كائنية التوجه في رحلة R على Coddy. الدرس 10 من 57.
داخل إحدى الطرق، تستدعي NextMethod() الطريقة التالية في التسلسل لنفس الدالة العامة، باستخدام الوسائط نفسها. بالنسبة إلى كائن ذي فئة واحدة، تكون الطريقة التالية هي الطريقة الافتراضية، لذا يمكن للطريقة إعادة استخدام الإجابة العامة وإضافة شيء إليها:
describe <- function(x) UseMethod("describe")
describe.default <- function(x) paste("an object with", length(x), "fields")
describe.task <- function(x) paste0(NextMethod(), ", titled ", x$title)
t <- structure(list(title = "Buy milk", done = FALSE), class = "task")
print(describe(t))الناتج:
[1] "an object with 2 fields, titled Buy milk"يمكن أن يكون للكائن عدة فئات في متجه، مثل c("urgent", "task"). يحاول الإرسال استخدام الفئات بالترتيب، وتنتقل NextMethod() في الطريقة الأولى إلى الطريقة الخاصة بالفئة التالية:
describe <- function(x) UseMethod("describe")
describe.task <- function(x) paste("task:", x$title)
describe.urgent <- function(x) paste("URGENT", NextMethod())
fix <- structure(list(title = "Fix the leak"), class = c("urgent", "task"))
print(describe(fix))الناتج:
[1] "URGENT task: Fix the leak"تمرّر NextMethod() كل وسيط تلقّته الطريقة، بما في ذلك الوسائط الإضافية مثل sep. ترى الطريقة التالية القيم نفسها من دون أن تسردها مرة أخرى:
label <- function(x, sep = ": ") UseMethod("label")
label.default <- function(x, sep = ": ") paste0("item", sep, x$name)
label.box <- function(x, sep = ": ") paste0("[", NextMethod(), "]")
b <- structure(list(name = "tools"), class = "box")
print(label(b))
print(label(b, sep = " = "))الناتج:
[1] "[item: tools]"
[1] "[item = tools]"يستخدم Base R الدالة NextMethod() للحفاظ على فئة عندما تكون المتجهة مجموعة فرعية. تسقط [ الافتراضية الفئة، لذلك تتيح لها طريقة "[.percent" تنفيذ العمل وتعيد الفئة:
format.percent <- function(x, ...) paste0(unclass(x) * 100, "%")
"[.percent" <- function(x, i) structure(NextMethod(), class = "percent")
p <- structure(c(0.1, 0.25, 0.5), class = "percent")
print(format(p[2:3]))الناتج:
[1] "25%" "50%"التحدي
سهلالمهام والمهام العاجلة فئتان في ملفين. في Task.R أكمل describe() العام، والطريقة الافتراضية التي تُرجع an item، وdescribe.task() التي تُرجع an item: Buy milk باستدعاء NextMethod() وإضافة العنوان. في Urgent.R أكمل describe.urgent() التي تُرجع URGENT an item: Fix bug باستدعاء NextMethod().
المُنشئات مُعطاة: للمهمة العاجلة الفئة c("urgent", "task"). يقرأ الكود المُقدَّم الأسطر task Buy milk أو urgent Fix bug أو أي كلمة أخرى مع عنوان، والتي تصبح كائنًا من تلك الفئة، ثم يطبع describe() لكل منها.
يجب أن تضع كودك في Task.R وUrgent.R. يحتوي main.R على كود الإدخال/الإخراج المُقدَّم ولا يمكن تعديله.
جرّب بنفسك
source("Task.R")
source("Urgent.R")
# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
kind <- sub(" .*", "", line)
title <- sub("^[a-z]+ ", "", line)
t <- if (kind == "urgent") new_urgent(title) else if (kind == "task") new_task(title) else structure(list(title = title), class = kind)
cat(describe(t), "\n", sep = "")
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات S3
التعامل مع الملفاتالقوائم باستخدام فئةدوال المُنشئأساليب الطباعة والتنسيقأدوات التحقق والمساعدةمراجعة - درجات الحرارة2S3 الدوال العامة والطرق
الدوال العامة وUseMethodالطرق الافتراضيةطرق الدوال العامة الأساسيةأساسيات NextMethodمراجعة - مساحات الأشكالتدرّب بنفسك: مترجم R عبر الإنترنت