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

أساسيات 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%"
challenge icon

التحدي

سهل

المهام والمهام العاجلة فئتان في ملفين. في 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 = "")
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم R عبر الإنترنت