callNextMethod
Parte de la sección Programación orientada a objetos del Journey de R de Coddy. Lección 33 de 57.
Dentro de un método S4, callNextMethod() llama al método de la clase principal con los mismos argumentos y devuelve su resultado. Un método hijo se basa en la respuesta de la clase principal en lugar de repetirla:
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)))Salida:
[1] "Ada earns 60000 and manages 4"También funciona para show(): la clase hija imprime las líneas de la clase padre y después las suyas:
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)Salida:
Employee: Ada
Reports: 4 new() llama al método genérico initialize(). Un método para este puede completar slots que se calculan a partir de otros. Primero llama a callNextMethod(.Object, ...), por lo que la configuración normal y la comprobación de validez siguen realizándose:
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)Salida:
[1] 7.5Al igual que NextMethod() en S3, callNextMethod() encadena varios niveles, y cada clase añade su parte:
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)))Salida:
30 60 110Desafío
FácilLas entradas tienen tres niveles, cada uno en su propio archivo. Las clases y la función genérica price() están declaradas. Añade los métodos:
Ticket.R:price()es el precio base;show()imprimeTicket for galay una nueva línea.Vip.R:price()es 1.5 veces el precio de la entrada;show()imprime la línea de la entrada y despuésVIP lounge access.Backstage.R:price()es el precio VIP más 50;show()imprime las líneas VIP y despuésBackstage pass.
Usa callNextMethod() en los métodos de las subclases. El código proporcionado lee las líneas vip gala 80 (nivel, evento, precio base) e imprime cada entrada y su precio.
Tu código debe ir en Ticket.R, Vip.R y Backstage.R. main.R contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
source("Ticket.R")
source("Vip.R")
source("Backstage.R")
# Código de entrada/salida suministrado: déjalo 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 = "")
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Fundamentos de S3
Trabajar con archivosListas con una claseFunciones constructorasMétodos de impresión y formatoValidadores y auxiliaresRepaso: temperaturas4Encapsulación en R
Cierres como objetosEntornos como objetosFunciones de accesoProtección del estadoRepaso: parquímetro7S4 Herencia
Extender con containscallNextMethodClases virtualesComprobar tipos con is()Repaso - Cuidador del zoológico2S3 Genéricos y métodos
Genéricos y UseMethodMétodos predeterminadosMétodos para genéricos baseFundamentos de NextMethodRepaso: áreas de figuras5Clases S4
Definición de clases S4Slots y accesoComprobaciones de validezMétodos showRepaso - Catálogo de productos8Clases de referencia
Definición de clases de referenciaMétodos y actualizaciones de camposSemántica de copiaHerencia y callSuperRepaso: cola de tareas11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de librosPractica por tu cuenta: Compilador de R online