Dasar-Dasar NextMethod
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan R di Coddy. Pelajaran 10 dari 57.
Di dalam method, NextMethod() memanggil method berikutnya untuk generic yang sama, dengan argumen yang sama. Untuk object dengan satu class, method berikutnya adalah method default, sehingga sebuah method dapat menggunakan kembali jawaban umum dan menambahkan sesuatu padanya:
describe <- function(x) UseMethod("describe")
describe.default <- function(x) paste("an object with", length(x), "fields")
describe.task <- function(x) paste0(NextMethod(), ", titled ", x$title)
t <- structure(list(title = "Buy milk", done = FALSE), class = "task")
print(describe(t))Output:
[1] "an object with 2 fields, titled Buy milk"Sebuah object dapat memiliki beberapa class dalam sebuah vektor, seperti c("urgent", "task"). Dispatch mencoba class-class tersebut secara berurutan, dan NextMethod() dalam method pertama beralih ke method untuk class berikutnya:
describe <- function(x) UseMethod("describe")
describe.task <- function(x) paste("task:", x$title)
describe.urgent <- function(x) paste("URGENT", NextMethod())
fix <- structure(list(title = "Fix the leak"), class = c("urgent", "task"))
print(describe(fix))Keluaran:
[1] "URGENT task: Fix the leak"NextMethod() meneruskan setiap argumen yang diterima method, termasuk argumen tambahan seperti sep. Method berikutnya melihat nilai yang sama tanpa kamu perlu mencantumkannya lagi:
label <- function(x, sep = ": ") UseMethod("label")
label.default <- function(x, sep = ": ") paste0("item", sep, x$name)
label.box <- function(x, sep = ": ") paste0("[", NextMethod(), "]")
b <- structure(list(name = "tools"), class = "box")
print(label(b))
print(label(b, sep = " = "))Output:
[1] "[item: tools]"
[1] "[item = tools]"Base R menggunakan NextMethod() untuk mempertahankan class saat sebuah vector diambil sebagian. [ bawaan menghapus class, jadi method "[.percent" membiarkannya melakukan tugasnya lalu mengembalikan class:
format.percent <- function(x, ...) paste0(unclass(x) * 100, "%")
"[.percent" <- function(x, i) structure(NextMethod(), class = "percent")
p <- structure(c(0.1, 0.25, 0.5), class = "percent")
print(format(p[2:3]))Output:
[1] "25%" "50%"Tantangan
MudahTugas dan tugas mendesak adalah dua class dalam dua file. Di Task.R, lengkapi fungsi generik describe(), method default yang mengembalikan an item, dan describe.task(), yang mengembalikan an item: Buy milk dengan memanggil NextMethod() dan menambahkan judul. Di Urgent.R, lengkapi describe.urgent(), yang mengembalikan URGENT an item: Fix bug dengan memanggil NextMethod().
Konstruktor sudah disediakan: tugas mendesak memiliki class c("urgent", "task"). Kode yang disediakan membaca baris task Buy milk, urgent Fix bug, atau kata lain apa pun dengan judul, yang menjadi object dari class tersebut, lalu mencetak describe() untuk masing-masing.
Tuliskan kodemu di Task.R dan Urgent.R. main.R berisi kode input/output yang disediakan dan tidak dapat diedit.
Coba sendiri
source("Task.R")
source("Urgent.R")
# Kode input/output yang disediakan: biarkan apa adanya
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
kind <- sub(" .*", "", line)
title <- sub("^[a-z]+ ", "", line)
t <- if (kind == "urgent") new_urgent(title) else if (kind == "task") new_task(title) else structure(list(title = title), class = kind)
cat(describe(t), "\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