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.5Comme 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 110Défi
FacileLes 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()afficheTicket for galaet passe à la ligne.Vip.R:price()correspond à 1.5 fois le prix du billet ;show()affiche la ligne du billet, puisVIP lounge access.Backstage.R:price()correspond au prix VIP augmenté de 50 ;show()affiche les lignes VIP, puisBackstage 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 = "")
}
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
1Bases de S3
Travailler avec les fichiersListes avec une classeFonctions constructricesMéthodes print et formatValidateurs et fonctions utilitairesRécapitulatif - Températures4Encapsulation dans R
Les fermetures comme objetsLes environnements comme objetsFonctions d’accèsProtéger l’étatRécapitulatif - Parcmètre7S4 Héritage
Extension avec containscallNextMethodClasses virtuellesVérifier les types avec is()Récapitulatif - Gardien de zoo2S3 : génériques et méthodes
Génériques et UseMethodMéthodes par défautMéthodes pour les génériques de baseNotions de base sur NextMethodRécapitulatif - Aires des formes5Classes S4
Définir des classes S4Slots et accèsVérifications de validitéMéthodes showRécapitulatif - Catalogue de produits8Classes de référence
Définition des classes de référenceMéthodes et mises à jour des champsSémantique de copieHéritage et callSuperRécapitulatif - File d’attente des tâches11Projet : gestion de bibliothèque
Livres et membresEmprunter des livres3Héritage S3
Vecteurs de classesOrdre de recherche des méthodesÉtendre avec NextMethodVérifier avec inherits()Récapitulatif - Paie du personnelEntraînez-vous par vous-même : Compilateur R en ligne