Rozszerzanie za pomocą contains
Część sekcji Programowanie obiektowe ścieżki R w Coddy. Lekcja 32 z 57.
contains = "Animal" sprawia, że nowa klasa S4 staje się podklasą Animal. Podklasa ma wszystkie sloty swojej klasy nadrzędnej oraz własne, a new() przyjmuje je wszystkie:
setClass("Animal", slots = c(name = "character", age = "numeric"))
setClass("Dog", contains = "Animal", slots = c(breed = "character"))
rex <- new("Dog", name = "Rex", age = 3, breed = "collie")
print(slotNames("Dog"))
cat(rex@name, rex@breed)Wynik:
[1] "breed" "name" "age"
Rex collieMetody napisane dla klasy nadrzędnej działają również dla klasy podrzędnej. Gdy generyk nie ma metody dla Dog, S4 używa metody dla Animal:
setClass("Animal", slots = c(name = "character"))
setClass("Dog", contains = "Animal")
invisible(setGeneric("intro", function(a) standardGeneric("intro")))
setMethod("intro", "Animal", function(a) paste("I am", a@name))
print(intro(new("Dog", name = "Rex")))Wynik:
[1] "I am Rex"Klasa potomna nadpisuje metodę klasy nadrzędnej, definiując własną metodę dla tego samego generyka. Wygrywa najbardziej szczegółowa klasa, a pozostałe podklasy zachowują metodę klasy nadrzędnej:
setClass("Animal", slots = c(name = "character"))
setClass("Dog", contains = "Animal")
setClass("Cat", contains = "Animal")
invisible(setGeneric("sound", function(a) standardGeneric("sound")))
setMethod("sound", "Animal", function(a) "...")
setMethod("sound", "Dog", function(a) "woof")
cat(sound(new("Dog", name = "Rex")), sound(new("Cat", name = "Tom")))Wynik:
woof ...W przypadku psa wyrażenie is(x, "Animal") ma wartość TRUE, a slot zadeklarowany jako "Animal" akceptuje obiekt klasy Dog. Kod napisany dla klasy nadrzędnej działa z każdą podklasą:
setClass("Animal", slots = c(name = "character"))
setClass("Dog", contains = "Animal")
setClass("Owner", slots = c(pet = "Animal"))
rex <- new("Dog", name = "Rex")
o <- new("Owner", pet = rex)
cat(is(rex, "Animal"), is(o@pet, "Dog"))Wynik:
TRUE TRUEWyzwanie
ŁatwyPracownicy i menedżerowie to klasy S4 w dwóch plikach. Employee.R deklaruje Employee (sloty name, salary) oraz funkcję generyczną describe(), a także wymaga metody dla Employee, która zwraca Bo earns 40000. W pliku Manager.R zadeklaruj Manager, który zawiera Employee i dodaje slot reports (numeryczny), oraz przesłoń describe(), tak aby zwracała Ada earns 60000 and manages 4.
Dostarczony kod odczytuje wiersze employee Bo 40000 lub manager Ada 60000 4 i wypisuje describe(), informację, czy obiekt jest pracownikiem, oraz jego sloty.
Umieść swój kod w plikach Employee.R i Manager.R. Plik main.R zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
source("Employee.R")
source("Manager.R")
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, " ")[[1]]
x <- if (p[1] == "manager") {
new("Manager", name = p[2], salary = as.numeric(p[3]), reports = as.numeric(p[4]))
} else {
new("Employee", name = p[2], salary = as.numeric(p[3]))
}
cat(describe(x), "\n", sep = "")
cat("is an employee: ", is(x, "Employee"), ", slots: ", paste(slotNames(x), collapse = ", "), "\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