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

تعريف فئات 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 36

setClass() تُرجع أيضًا دالة مولِّدة. أسندها إلى اسم، عادةً اسم الفئة، واستدعها مثل المُنشئ:

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
challenge icon

التحدي

سهل

صرّح بالصنف 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 = "")
quiz iconاختبر نفسك

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

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

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