تعريف فئات S4
جزء من قسم البرمجة كائنية التوجه في رحلة R على Coddy. الدرس 22 من 57.
S4 هو نظام الكائنات الرسمي في R. تُعرِّف setClass() فئةً ذات خانات مُسمّاة ونوع كل منها، بينما تُنشئ new() كائنًا. يقرأ العامل @ خانةً:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
cat(ada@name, "is", ada@age)الناتج:
Ada is 36setClass() تُرجع أيضًا دالة مولِّدة. أسندها إلى اسم، عادةً اسم الفئة، واستدعها مثل المُنشئ:
Person <- setClass("Person", slots = c(name = "character", age = "numeric"))
bo <- Person(name = "Bo", age = 7)
print(bo@age + 1)
print(is(bo, "Person"))الناتج:
[1] 8
[1] TRUEبخلاف S3، يتحقق R من الفتحات. تؤدي الفتحة غير المعروفة أو القيمة من النوع الخاطئ إلى إيقاف new() مع ظهور خطأ، ولذلك يكون لكائن S4 دائمًا الشكل الذي يعلنه صنفه:
setClass("Person", slots = c(name = "character", age = "numeric"))
p <- new("Person", name = "Cy", age = "ten")المخرجات:
Error in validObject(.Object) :
invalid class “Person” object: invalid object for slot "age" in class "Person": got class "character", should be or extend class "numeric"
Calls: new -> initialize -> initialize -> validObject
Execution haltedالفتحة التي لا يتم تحديدها تحصل على قيمة فارغة من نوعها، مثل character(0). يعيّن prototype القيم الافتراضية الفعلية بدلًا من ذلك. يعلن الكود الأقدم عن الفتحات باستخدام representation()، وهو ما يعني الشيء نفسه مثل slots:
setClass("Task", slots = c(title = "character", done = "logical"),
prototype = list(done = FALSE))
setClass("Note", representation(text = "character"))
t <- new("Task", title = "Write report")
print(t@done)
print(length(new("Note")@text))الناتج:
[1] FALSE
[1] 0التحدي
سهلصرّح بالصنف S4 Book في Book.R مع ثلاث خانات: title وauthor من النوع character، وpages من النوع numeric. ثم أكمل book_label(b)، التي تقرأ الخانات باستخدام @ وتُرجع Dune by Frank Herbert (412 pages).
يقرأ الكود الم provided الأسطر title;author;pages، وينشئ كل كتاب باستخدام new("Book", ...)، ويطبع تصنيفه، وأخيرًا أسماء خانات الصنف.
يجب أن تضع كودك في Book.R. يحتوي main.R على كود الإدخال/الإخراج الم provided، ولا يمكن تعديله.
جرّب بنفسك
source("Book.R")
# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, ";")[[1]]
b <- new("Book", title = p[1], author = p[2], pages = as.numeric(p[3]))
cat(book_label(b), "\n", sep = "")
}
cat("slots: ", paste(slotNames("Book"), collapse = ", "), "\n", sep = "")
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات S3
التعامل مع الملفاتالقوائم باستخدام فئةدوال المُنشئأساليب الطباعة والتنسيقأدوات التحقق والمساعدةمراجعة - درجات الحرارة2S3 الدوال العامة والطرق
الدوال العامة وUseMethodالطرق الافتراضيةطرق الدوال العامة الأساسيةأساسيات NextMethodمراجعة - مساحات الأشكالتدرّب بنفسك: مترجم R عبر الإنترنت