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] 5000Menuliskan 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"Tantangan
MudahData 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 = "")
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar S3
Bekerja dengan fileList dengan classFungsi KonstruktorMethod print dan formatValidator dan helperUlasan: Suhu4Enkapsulasi di R
Closure sebagai objectEnvironment sebagai objectFungsi accessorMelindungi stateRangkuman: Meter Parkir2S3 Generics dan Method
Generics dan UseMethodMethod DefaultMethod untuk Base GenericsDasar-Dasar NextMethodRekap: Luas Bangun5S4 class
Mendefinisikan class S4Slots dan AksesPemeriksaan ValiditasMethod showRingkasan: Katalog Produk8Kelas Referensi
Mendefinisikan Kelas ReferensiPembaruan method dan fieldSemantik PenyalinanPewarisan dan callSuperRangkuman: Antrean Tugas11Proyek: Manajemen Perpustakaan
Buku dan AnggotaMeminjam BukuLatihan sendiri: Compiler R online