تعريف الأصناف المرجعية
جزء من قسم البرمجة كائنية التوجه في رحلة 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 (من النوع المحرفي) وpages (من النوع الرقمي)، واحتفظ بالمولّد في 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 عبر الإنترنت