Menu
Coddy logo textTech

callNextMethod

Fait partie de la section Programmation orientée objet du Journey R de Coddy. Leçon 33 sur 57.

Dans une méthode S4, callNextMethod() appelle la méthode de la classe parente avec les mêmes arguments et renvoie son résultat. Une méthode enfant s’appuie sur la réponse de la méthode parente au lieu de la répéter :

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)))

Sortie :

[1] "Ada earns 60000 and manages 4"

Cela fonctionne aussi pour show() : l’enfant affiche les lignes du parent, puis les siennes :

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)

Sortie :

Employee: Ada 
Reports: 4 

new() appelle la méthode générique initialize(). Une méthode pour celle-ci peut remplir des slots calculés à partir d’autres slots. Elle appelle d’abord callNextMethod(.Object, ...), afin que la configuration normale et la vérification de validité aient toujours lieu :

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)

Résultat :

[1] 7.5

Comme NextMethod() dans S3, callNextMethod() s’enchaîne à travers plusieurs niveaux, chaque classe ajoutant sa partie :

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)))

Sortie :

30 60 110
challenge icon

Défi

Facile

Les billets existent en trois niveaux, chacun dans son propre fichier. Les classes et la méthode générique price() sont déclarées. Ajoutez les méthodes :

  • Ticket.R : price() correspond au prix de base ; show() affiche Ticket for gala et passe à la ligne.
  • Vip.R : price() correspond à 1.5 fois le prix du billet ; show() affiche la ligne du billet, puis VIP lounge access.
  • Backstage.R : price() correspond au prix VIP augmenté de 50 ; show() affiche les lignes VIP, puis Backstage pass.

Utilisez callNextMethod() dans les méthodes des sous-classes. Le code fourni lit les lignes vip gala 80 (niveau, événement, prix de base) et affiche chaque billet ainsi que son prix.

Votre code doit être placé dans Ticket.R, Vip.R et Backstage.R. main.R contient le code fourni pour les entrées/sorties et ne peut pas être modifié.

Essayez vous-même

source("Ticket.R")
source("Vip.R")
source("Backstage.R")

# Code d'entrée/sortie fourni : le laisser tel quel
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 = "")
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur R en ligne