callNextMethod
Część sekcji Programowanie obiektowe ścieżki R w Coddy. Lekcja 33 z 57.
Wewnątrz metody S4 funkcja callNextMethod() wywołuje metodę klasy nadrzędnej z tymi samymi argumentami i zwraca jej wynik. Metoda klasy potomnej rozwija odpowiedź klasy nadrzędnej zamiast ją powtarzać:
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)))Wynik:
[1] "Ada earns 60000 and manages 4"To działa również w przypadku show(): klasa potomna wyświetla wiersze klasy nadrzędnej, a następnie własne:
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)Wynik:
Employee: Ada
Reports: 4 new() wywołuje funkcję ogólną initialize(). Metoda dla niej może wypełniać sloty, których wartości są obliczane na podstawie innych slotów. Najpierw wywołuje callNextMethod(.Object, ...), więc standardowa inicjalizacja i sprawdzanie poprawności nadal się odbywają:
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)Wynik:
[1] 7.5Podobnie jak NextMethod() w S3, callNextMethod() przechodzi przez kilka poziomów, a każda klasa dodaje swoją część:
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)))Wynik:
30 60 110Wyzwanie
ŁatwyBilety występują na trzech poziomach, każdy w osobnym pliku. Klasy i funkcja generyczna price() są już zadeklarowane. Dodaj metody:
Ticket.R:price()zwraca cenę podstawową;show()wyświetlaTicket for galai znak nowej linii.Vip.R:price()zwraca cenę biletu pomnożoną przez 1.5;show()wyświetla wiersz biletu, a następnieVIP lounge access.Backstage.R:price()zwraca cenę biletu VIP powiększoną o 50;show()wyświetla wiersze biletu VIP, a następnieBackstage pass.
Użyj callNextMethod() w metodach podklas. Dostarczony kod odczytuje wiersze vip gala 80 (poziom, wydarzenie, cena podstawowa) i wyświetla każdy bilet oraz jego cenę.
Umieść swój kod w plikach Ticket.R, Vip.R i Backstage.R. Plik main.R zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
source("Ticket.R")
source("Vip.R")
source("Backstage.R")
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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 = "")
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy S3
Praca z plikamiListy z klasąFunkcje konstruktoraMetody print i formatWalidatory i funkcje pomocniczePowtórzenie — temperatury4Enkapsulacja w R
Domknięcia jako obiektyŚrodowiska jako obiektyFunkcje dostępoweOchrona stanuPodsumowanie – parkometr7S4 Dziedziczenie
Rozszerzanie za pomocą containscallNextMethodKlasy wirtualneSprawdzanie typów za pomocą is()Podsumowanie — opiekun zoo2Generics i metody S3
Generics i UseMethodMetody domyślneMetody dla podstawowych genericsPodstawy NextMethodPowtórzenie — pola figur5Klasy S4
Definiowanie klas S4Sloty i dostępSprawdzanie poprawnościMetody wyświetlaniaPodsumowanie – katalog produktów8Klasy referencyjne
Definiowanie klas referencyjnychMetody i aktualizacja pólSemantyka kopiowaniaDziedziczenie i callSuperPodsumowanie – kolejka zadań11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książek3Dziedziczenie S3
Wektory klasKolejność wyszukiwania metodRozszerzanie za pomocą NextMethodSprawdzanie za pomocą inherits()Powtórzenie — lista płac pracownikówPoćwicz samodzielnie: Kompilator R online