callNextMethod
Fa parte della sezione Programmazione orientata agli oggetti del percorso R di Coddy. Lezione 33 di 57.
All'interno di un metodo S4, callNextMethod() chiama il metodo della classe genitore con gli stessi argomenti e ne restituisce il risultato. Un metodo figlio si basa sulla risposta del genitore invece di ripeterla:
setClass("Employee", slots = c(name = "character", salary = "numeric"))
setClass("Manager", contains = "Employee", slots = c(reports = "numeric"))
invisible(setGeneric("describe", function(x) standardGeneric("describe")))
setMethod("describe", "Employee", function(x) paste(x@name, "earns", x@salary))
setMethod("describe", "Manager", function(x) paste(callNextMethod(), "and manages", x@reports))
print(describe(new("Manager", name = "Ada", salary = 60000, reports = 4)))Output:
[1] "Ada earns 60000 and manages 4"Funziona anche per show(): la classe figlia stampa le righe della classe genitore e poi le proprie:
setClass("Employee", slots = c(name = "character"))
setClass("Manager", contains = "Employee", slots = c(reports = "numeric"))
setMethod("show", "Employee", function(object) cat("Employee:", object@name, "\n"))
setMethod("show", "Manager", function(object) {
callNextMethod()
cat("Reports:", object@reports, "\n")
})
new("Manager", name = "Ada", reports = 4)Output:
Employee: Ada
Reports: 4 new() chiama il generico initialize(). Un metodo per questo può riempire slot ricavati da altri. Chiama prima callNextMethod(.Object, ...), così vengono comunque eseguiti la normale configurazione e il controllo di validità:
setClass("Order", slots = c(prices = "numeric", total = "numeric"))
setMethod("initialize", "Order", function(.Object, ...) {
.Object <- callNextMethod(.Object, ...)
.Object@total <- sum(.Object@prices)
.Object
})
o <- new("Order", prices = c(2.5, 4, 1))
print(o@total)Output:
[1] 7.5Come NextMethod() in S3, callNextMethod() attraversa diversi livelli, ognuno dei quali aggiunge il proprio contributo:
setClass("Ticket", slots = c(base = "numeric"))
setClass("Vip", contains = "Ticket")
setClass("Backstage", contains = "Vip")
invisible(setGeneric("price", function(t) standardGeneric("price")))
setMethod("price", "Ticket", function(t) t@base)
setMethod("price", "Vip", function(t) callNextMethod() * 2)
setMethod("price", "Backstage", function(t) callNextMethod() + 50)
cat(price(new("Ticket", base = 30)), price(new("Vip", base = 30)), price(new("Backstage", base = 30)))Output:
30 60 110Sfida
FacileI biglietti sono disponibili in tre livelli, ciascuno nel proprio file. Le classi e la funzione generica price() sono dichiarate. Aggiungi i metodi:
Ticket.R:price()è il prezzo base;show()stampaTicket for galae una nuova riga.Vip.R:price()è pari a 1.5 volte il prezzo del biglietto;show()stampa la riga del biglietto e poiVIP lounge access.Backstage.R:price()è pari al prezzo VIP più 50;show()stampa le righe VIP e poiBackstage pass.
Usa callNextMethod() nei metodi delle sottoclassi. Il codice fornito legge le righe vip gala 80 (livello, evento, prezzo base) e stampa ogni biglietto e il relativo prezzo.
Il tuo codice va inserito in Ticket.R, Vip.R e Backstage.R. main.R contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
source("Ticket.R")
source("Vip.R")
source("Backstage.R")
# Código de entrada/salida proporcionado: déjalo tal como está
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, " ")[[1]]
base <- as.numeric(p[3])
t <- switch(p[1],
standard = new("Ticket", event = p[2], base = base),
vip = new("VipTicket", event = p[2], base = base),
backstage = new("BackstageTicket", event = p[2], base = base))
print(t)
cat(sprintf("price: %.2f", price(t)), "\n", sep = "")
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Nozioni di base su S3
Lavorare con i fileListe con una classeFunzioni costruttriciMetodi di stampa e formattazioneValidatori e funzioni di supportoRipasso - Temperature4Incapsulamento in R
Chiusure come oggettiAmbienti come oggettiFunzioni di accessoProteggere lo statoRiepilogo - Parcometro7S4 Ereditarietà
Estendere con containscallNextMethodClassi virtualiVerificare i tipi con is()Riepilogo - Guardiano dello zoo2Generics e metodi S3
Generics e UseMethodMetodi predefinitiMetodi per i generics di baseNozioni di base su NextMethodRiepilogo - Aree delle forme5Classi S4
Definire le classi S4Slot e accessoControlli di validitàMetodi showRiepilogo - Catalogo prodotti8Classi di riferimento
Definizione delle classi di riferimentoMetodi e aggiornamenti dei campiSemantica della copiaEreditarietà e callSuperRiepilogo - coda di attività11Progetto: Gestione della biblioteca
Libri e iscrittiPrestito dei libriEsercitati da solo: Compilatore R online