Menu
CoddyTech

Vektor class

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan R di Coddy. Pelajaran 12 dari 57.

Inheritance S3 berasal dari vektor class. Object dengan class = c("manager", "employee") adalah manager sekaligus employee. Jika generic tidak memiliki method untuk manager, dispatch berlanjut dan menggunakan method employee:

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))

Output:

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

Menuliskan vektor class secara manual di setiap konstruktor mengulang detail milik induknya. Sebagai gantinya, konstruktor induk menerima argumen class dan menambahkannya di depan class miliknya sendiri, lalu konstruktor turunan memanggil konstruktor induk:

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))

Output:

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

... dari konstruktor induk mengumpulkan field tambahan milik anak, di sini reports, dan menempatkannya setelah field milik induk. Employee biasa tidak memiliki field reports sama sekali:

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))

Output:

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

Urutan vektor class itu penting: class yang paling spesifik harus berada di urutan pertama. Jika parent berada di urutan pertama, method-nya yang akan digunakan dan method milik child tidak akan pernah digunakan:

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))

Output:

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

Tantangan

Mudah

Data karyawan dan manajer dibagi ke dalam dua file. Lengkapi new_employee(name, salary, ..., class = character()) di Employee.R: fungsi ini mengembalikan list dengan name, salary, dan field tambahan apa pun dari ..., dengan vektor class c(class, "employee"). Lalu lengkapi new_manager(name, salary, reports) di Manager.R, yang memanggil new_employee() dengan field tambahan reports dan class manager.

label() dan method employee-nya sudah disediakan, jadi manajer mendapatkan label tanpa method sendiri. Kode yang disediakan membaca baris employee Bo 40000 atau manager Ada 60000 4, lalu mencetak vektor class, nama field, dan label.

Tulis kodemu di Employee.R dan Manager.R. main.R berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

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

# Kode input/output yang disediakan: biarkan apa adanya
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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler R online