Extender con contains
Parte de la sección Programación orientada a objetos del Journey de R de Coddy. Lección 32 de 57.
contains = "Animal" convierte una nueva clase S4 en una subclase de Animal. La subclase tiene cada slot de su clase padre, además de los propios, y new() los acepta todos:
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)Salida:
[1] "breed" "name" "age"
Rex collieLos métodos escritos para el padre también funcionan para el hijo. Cuando un genérico no tiene ningún método para Dog, S4 utiliza el de 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")))Salida:
[1] "I am Rex"Una clase hija sobrescribe un método de la clase padre al definir el suyo propio para el mismo genérico. Gana la clase más específica, y las demás subclases conservan el método de la clase padre:
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")))Salida:
woof ...is(x, "Animal") es TRUE para un perro, y un slot declarado como "Animal" acepta un Dog. El código escrito para la clase principal funciona con cada subclase:
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"))Salida:
TRUE TRUEDesafío
FácilLos empleados y los gerentes son clases S4 en dos archivos. Employee.R declara Employee (ranuras name, salary) y el genérico describe(), y necesita un método para Employee que devuelva Bo earns 40000. En Manager.R declara Manager, que contiene Employee y añade la ranura reports (numérica), y sobrescribe describe() para que devuelva Ada earns 60000 and manages 4.
El código proporcionado lee líneas employee Bo 40000 o manager Ada 60000 4 e imprime describe(), si el objeto es un empleado y sus ranuras.
Tu código va en Employee.R y Manager.R. main.R contiene el código de entrada/salida proporcionado y no se puede editar.
Pruébalo tú mismo
source("Employee.R")
source("Manager.R")
# Código de entrada/salida suministrado: déjalo 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 = "")
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Fundamentos de S3
Trabajar con archivosListas con una claseFunciones constructorasMétodos de impresión y formatoValidadores y auxiliaresRepaso: temperaturas4Encapsulación en R
Cierres como objetosEntornos como objetosFunciones de accesoProtección del estadoRepaso: parquímetro7S4 Herencia
Extender con containscallNextMethodClases virtualesComprobar tipos con is()Repaso - Cuidador del zoológico2S3 Genéricos y métodos
Genéricos y UseMethodMétodos predeterminadosMétodos para genéricos baseFundamentos de NextMethodRepaso: áreas de figuras5Clases S4
Definición de clases S4Slots y accesoComprobaciones de validezMétodos showRepaso - Catálogo de productos8Clases de referencia
Definición de clases de referenciaMétodos y actualizaciones de camposSemántica de copiaHerencia y callSuperRepaso: cola de tareas11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de librosPractica por tu cuenta: Compilador de R online