Estendere con contains
Fa parte della sezione Programmazione orientata agli oggetti del percorso R di Coddy. Lezione 32 di 57.
contains = "Animal" rende una nuova classe S4 una sottoclasse di Animal. La sottoclasse ha tutti gli slot della classe padre, oltre ai propri, e new() li accetta tutti:
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)Output:
[1] "breed" "name" "age"
Rex collieI metodi scritti per la classe genitore funzionano anche per la classe figlia. Quando un generico non ha un metodo per Dog, S4 usa quello per 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")))Output:
[1] "I am Rex"Una classe figlia sovrascrive un metodo della classe genitore definendone uno proprio per lo stesso generico. Vince la classe più specifica e le altre sottoclassi mantengono il metodo della classe genitore:
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")))Output:
woof ...is(x, "Animal") è TRUE per un cane e uno slot dichiarato come "Animal" accetta un Dog. Il codice scritto per la classe genitore funziona con ogni sottoclasse:
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"))Output:
TRUE TRUESfida
FacileI dipendenti e i manager sono classi S4 in due file. Employee.R dichiara Employee (slot name, salary) e il generico describe(), e richiede un metodo per Employee che restituisca Bo earns 40000. In Manager.R dichiara Manager, che contiene Employee e aggiunge lo slot reports (numerico), e ridefinisci describe() in modo che restituisca Ada earns 60000 and manages 4.
Il codice fornito legge righe employee Bo 40000 o manager Ada 60000 4 e stampa describe(), se l'oggetto è un dipendente e i suoi slot.
Il tuo codice va in Employee.R e Manager.R. main.R contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
source("Employee.R")
source("Manager.R")
# Código de entrada/salida proporcionado: mantenlo tal como está
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 = "")
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Nozioni di base su S3
Lavorare con i fileListe con una classeFunzioni costruttriciMetodi di stampa e formattazioneValidatori e funzioni di supportoRipasso - Temperature4Incapsulamento in R
Chiusure come oggettiAmbienti come oggettiFunzioni di accessoProteggere lo statoRiepilogo - Parcometro7S4 Ereditarietà
Estendere con containscallNextMethodClassi virtualiVerificare i tipi con is()Riepilogo - Guardiano dello zoo2Generics e metodi S3
Generics e UseMethodMetodi predefinitiMetodi per i generics di baseNozioni di base su NextMethodRiepilogo - Aree delle forme5Classi S4
Definire le classi S4Slot e accessoControlli di validitàMetodi showRiepilogo - Catalogo prodotti8Classi di riferimento
Definizione delle classi di riferimentoMetodi e aggiornamenti dei campiSemantica della copiaEreditarietà e callSuperRiepilogo - coda di attività11Progetto: Gestione della biblioteca
Libri e iscrittiPrestito dei libriEsercitati da solo: Compilatore R online