callNextMethod
Parte da seção Programação Orientada a Objetos do Journey de R da Coddy. Lição 33 de 57.
Dentro de um método S4, callNextMethod() chama o método da classe pai com os mesmos argumentos e retorna o resultado. Um método filho se baseia na resposta do pai em vez de repeti-la:
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)))Saída:
[1] "Ada earns 60000 and manages 4"Isso também funciona para show(): o filho imprime as linhas do pai e depois as suas próprias:
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)Saída:
Employee: Ada
Reports: 4 new() chama o genérico initialize(). Um método para ele pode preencher slots que são calculados a partir de outros. Ele chama callNextMethod(.Object, ...) primeiro, para que a configuração normal e a verificação de validade ainda ocorram:
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)Saída:
[1] 7.5Assim como NextMethod() em S3, callNextMethod() encadeia-se por vários níveis, com cada classe adicionando sua 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)))Saída:
30 60 110Desafio
FácilOs ingressos vêm em três níveis, cada um em seu próprio arquivo. As classes e o genérico price() são declarados. Adicione os métodos:
Ticket.R:price()é o preço base;show()imprimeTicket for galae uma nova linha.Vip.R:price()é 1.5 vezes o preço do ingresso;show()imprime a linha do ingresso e, em seguida,VIP lounge access.Backstage.R:price()é o preço VIP mais 50;show()imprime as linhas VIP e, em seguida,Backstage pass.
Use callNextMethod() nos métodos das subclasses. O código fornecido lê as linhas vip gala 80 (nível, evento, preço base) e imprime cada ingresso e seu preço.
Seu código deve estar em Ticket.R, Vip.R e Backstage.R. main.R contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
source("Ticket.R")
source("Vip.R")
source("Backstage.R")
# Código de entrada/saída fornecido: mantenha-o 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 lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos do S3
Trabalhando com ArquivosListas com uma ClasseFunções ConstrutorasMétodos de Impressão e FormataçãoValidadores e AuxiliaresRevisão - Temperaturas4Encapsulamento em R
Closures como ObjetosAmbientes como ObjetosFunções de AcessoProtegendo o EstadoRecapitulação - Parquímetro7S4 Herança
Estendendo com containscallNextMethodClasses VirtuaisVerificando Tipos com is()Revisão - Cuidador do Zoológico2Genéricos e Métodos S3
Genéricos e UseMethodMétodos padrãoMétodos para genéricos baseFundamentos de NextMethodRevisão - Áreas de formas5Classes S4
Definindo classes S4Slots e acessoVerificações de validadeMétodos showRevisão - Catálogo de produtos8Classes de Referência
Definindo Classes de ReferênciaMétodos e Atualizações de CamposSemântica de CópiaHerança e callSuperRecapitulação — Fila de Tarefas11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Compilador de R online