Menu
CoddyTech

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

يقرأ الكود المرفق أسطرًا بالتنسيق title;author;pages، وينشئ كل كتاب باستخدام new("Book", ...)، ويطبع تسميته، ثم أسماء خانات الفئة.

ضع الكود في Book.R. يحتوي main.R على كود الإدخال/الإخراج المرفق، ولا يمكن تعديله.

جرّب بنفسك

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 عبر الإنترنت