تعريف الأصناف المرجعية
جزء من قسم البرمجة كائنية التوجه في رحلة R على Coddy. الدرس 37 من 57.
الفئات المرجعية (RC) هي نظام R للكائنات التي تتغير في مكانها، كما في Java أو Python. يعرّف setRefClass() فئةً ذات حقول محددة الأنواع ويُرجع مولّدًا؛ ينشئ $new() كائنًا، ويقرأ $ حقوله ويغيّرها:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
a <- Account$new(owner = "Ada", balance = 100)
a$balance <- a$balance + 50
cat(a$owner, a$balance)المخرجات:
Ada 150كائن RC هو مرجع، مثل البيئة. إن إسناده إلى متغير آخر أو تمريره إلى دالة لا ينسخه، لذا فإن التغيير عبر أي اسم هو تغيير في الكائن نفسه:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
pay_fee <- function(acc) acc$balance <- acc$balance - 5
a <- Account$new(owner = "Ada", balance = 100)
b <- a
b$balance <- 60
pay_fee(a)
cat(a$balance, b$balance)الناتج:
55 55تكون للحقول أنواع محددة. يُرفض إسناد قيمة من فئة غير صحيحة، ويحتفظ الحقل بقيمته القديمة:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
a <- Account$new(owner = "Ada", balance = 100)
msg <- tryCatch({ a$balance <- "lots"; "changed" }, error = function(e) conditionMessage(e))
cat(msg, "\n")
cat(a$balance, "\n")الناتج:
invalid assignment for reference class field ‘balance’, should be from class “numeric” or a subclass (was class “character”)
100 يصف المُنشئ الصنف: تسرد Account$fields() الحقول وأنواعها. يسرد الكائن المطبوع من دون طريقة show حقوله؛ ويكون الحقل الذي لم تُحدَّد له قيمة فارغًا:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
print(Account$fields())
Account$new(owner = "Bo")الناتج:
owner balance
"character" "numeric"
Reference class object of class "Account"
Field "owner":
[1] "Bo"
Field "balance":
numeric(0)التحدي
سهلصرّح بالفئة المرجعية Book في Book.R مع الحقلين title وauthor (من النوع character) والحقل pages (من النوع numeric)، وأبقِ المُنشئ في Book. ثم اكتب add_pages(book, n)، التي تضيف n إلى عدد صفحات الكتاب مباشرةً، ولا تُرجع شيئًا ذا فائدة.
تقرأ الشيفرة المُقدَّمة title;author;pages، وتنشئ الكتاب، وتُسنِده إلى متغيّر ثانٍ، ثم تضيف الأعداد المتبقية باستخدام ذلك الاسم الثاني، وتطبع الكتاب الأصلي وأسماء الحقول.
ضع شيفرتك في Book.R. يحتوي main.R على شيفرة الإدخال والإخراج المُقدَّمة، ولا يمكن تعديلها.
جرّب بنفسك
source("Book.R")
# رمز الإدخال/الإخراج المقدَّم: أبقه كما هو
input <- suppressWarnings(readLines(file("stdin")))
p <- strsplit(input[1], ";")[[1]]
b <- Book$new(title = p[1], author = p[2], pages = as.numeric(p[3]))
alias <- b
for (n in as.numeric(input[-1])) add_pages(alias, n)
cat(b$title, " by ", b$author, ": ", b$pages, " pages\n", sep = "")
cat("fields: ", paste(names(Book$fields()), collapse = ", "), "\n", sep = "")
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات S3
التعامل مع الملفاتالقوائم باستخدام فئةدوال المُنشئأساليب الطباعة والتنسيقأدوات التحقق والمساعدةمراجعة - درجات الحرارة2S3 الدوال العامة والطرق
الدوال العامة وUseMethodالطرق الافتراضيةطرق الدوال العامة الأساسيةأساسيات NextMethodمراجعة - مساحات الأشكال8الأصناف المرجعية
تعريف الأصناف المرجعيةتحديث الأساليب والحقولدلالات النسخالوراثة وcallSuperمراجعة - قائمة المهامتدرّب بنفسك: مترجم R عبر الإنترنت