Menu
Coddy logo textTech

Sınıf Vektörleri

Coddy'nin R Journey'sinin Nesne Tabanlı Programlama bölümünün bir parçası. Ders 12 / 57.

S3 kalıtımı sınıf vektöründen gelir. class = c("manager", "employee") değerine sahip bir nesne hem yöneticidir hem de çalışandır. Bir generic'in manager için yöntemi olmadığında, dağıtım devam eder ve employee yöntemini kullanır:

pay <- function(x) UseMethod("pay")
pay.employee <- function(x) x$salary / 12
m <- structure(list(name = "Ada", salary = 60000), class = c("manager", "employee"))
print(class(m))
print(pay(m))

Çıktı:

[1] "manager"  "employee"
[1] 5000

Her kurucuda sınıf vektörünü elle yazmak, ebeveynin ayrıntılarını tekrarlar. Bunun yerine ebeveyn kurucu bir class bağımsız değişkeni alır ve bunu kendi sınıfının önüne koyar; alt sınıf kurucusu da ebeveyn kurucuyu çağırır:

new_employee <- function(name, salary, ..., class = character()) {
  structure(list(name = name, salary = salary, ...), class = c(class, "employee"))
}
new_manager <- function(name, salary, reports) {
  new_employee(name, salary, reports = reports, class = "manager")
}
m <- new_manager("Ada", 60000, 4)
print(class(m))
print(names(m))

Çıktı:

[1] "manager"  "employee"
[1] "name"    "salary"  "reports"

Ana kurucunun ... ifadesi, çocuğa ait ek alanları (burada reports) toplar ve bunları ana kurucunun kendi alanlarının arkasına yerleştirir. Sıradan bir çalışanın hiç reports alanı yoktur:

new_employee <- function(name, salary, ..., class = character()) {
  structure(list(name = name, salary = salary, ...), class = c(class, "employee"))
}
e <- new_employee("Bo", 40000)
print(class(e))
print(names(e))

Çıktı:

[1] "employee"
[1] "name"   "salary"

Sınıf vektörünün sırası önemlidir: en özel sınıf önce gelir. Üst sınıf önce geldiğinde, onun yöntemleri kazanır ve alt sınıfın yöntemleri hiçbir zaman kullanılmaz:

title <- function(x) UseMethod("title")
title.employee <- function(x) "employee"
title.manager <- function(x) "manager"
right <- structure(list(), class = c("manager", "employee"))
wrong <- structure(list(), class = c("employee", "manager"))
print(title(right))
print(title(wrong))

Çıktı:

[1] "manager"
[1] "employee"
challenge icon

Görev

Kolay

Çalışanlar ve yöneticiler iki dosyaya ayrılmıştır. Employee.R içindeki new_employee(name, salary, ..., class = character()) işlevini tamamlayın: bu işlev name, salary ve ... içindeki tüm ek alanları içeren bir listeyi, c(class, "employee") sınıf vektörüyle birlikte döndürür. Ardından Manager.R içindeki new_manager(name, salary, reports) işlevini tamamlayın; bu işlev, reports ek alanını ve manager sınıfını kullanarak new_employee() işlevini çağırır.

label() ve onun employee yöntemi verilmiştir; bu nedenle yöneticiler kendilerine ait bir yöntem olmadan da bir etiket alır. Sağlanan kod, employee Bo 40000 veya manager Ada 60000 4 satırlarını okur ve sınıf vektörünü, alan adlarını ve etiketi yazdırır.

Kodunuz Employee.R ve Manager.R dosyalarına yazılmalıdır. main.R, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

source("Employee.R")
source("Manager.R")

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
  p <- strsplit(line, " ")[[1]]
  x <- if (p[1] == "manager") new_manager(p[2], as.numeric(p[3]), as.numeric(p[4])) else new_employee(p[2], as.numeric(p[3]))
  cat("class: ", paste(class(x), collapse = ", "), "\n", sep = "")
  cat("fields: ", paste(names(x), collapse = ", "), "\n", sep = "")
  cat(label(x), "\n", sep = "")
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Tabanlı Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online R derleyicisi