Vectores de clase
Parte de la sección Programación orientada a objetos del Journey de R de Coddy. Lección 12 de 57.
La herencia de S3 proviene del vector de clases. Un objeto con class = c("manager", "employee") es un gerente y también un empleado. Cuando un genérico no tiene ningún método para manager, el envío continúa y utiliza el método de employee:
pay <- function(x) UseMethod("pay")
pay.employee <- function(x) x$salary / 12
m <- structure(list(name = "Ada", salary = 60000), class = c("manager", "employee"))
print(class(m))
print(pay(m))Salida:
[1] "manager" "employee"
[1] 5000Escribir el vector de clase manualmente en cada constructor repite los detalles del padre. En su lugar, el constructor del padre recibe un argumento class y lo coloca delante de su propia clase, y el constructor hijo llama al del padre:
new_employee <- function(name, salary, ..., class = character()) {
structure(list(name = name, salary = salary, ...), class = c(class, "employee"))
}
new_manager <- function(name, salary, reports) {
new_employee(name, salary, reports = reports, class = "manager")
}
m <- new_manager("Ada", 60000, 4)
print(class(m))
print(names(m))Salida:
[1] "manager" "employee"
[1] "name" "salary" "reports"El ... del constructor padre recopila los campos adicionales del hijo, aquí reports, y los coloca después de los propios campos del padre. Un empleado normal no tiene ningún campo reports:
new_employee <- function(name, salary, ..., class = character()) {
structure(list(name = name, salary = salary, ...), class = c(class, "employee"))
}
e <- new_employee("Bo", 40000)
print(class(e))
print(names(e))Salida:
[1] "employee"
[1] "name" "salary"El orden del vector de clases importa: la clase más específica va primero. Si se coloca primero la clase padre, sus métodos tienen prioridad y los métodos de la clase hija nunca se utilizan:
title <- function(x) UseMethod("title")
title.employee <- function(x) "employee"
title.manager <- function(x) "manager"
right <- structure(list(), class = c("manager", "employee"))
wrong <- structure(list(), class = c("employee", "manager"))
print(title(right))
print(title(wrong))Salida:
[1] "manager"
[1] "employee"Desafío
FácilLos empleados y los gerentes están divididos en dos archivos. Completa new_employee(name, salary, ..., class = character()) en Employee.R: devuelve una lista con name, salary y cualquier campo adicional de ..., con el vector de clase c(class, "employee"). Después, completa new_manager(name, salary, reports) en Manager.R, que llama a new_employee() con el campo adicional reports y la clase manager.
Se proporcionan label() y su método employee, por lo que los gerentes obtienen una etiqueta sin tener un método propio. El código proporcionado lee líneas como employee Bo 40000 o manager Ada 60000 4 e imprime el vector de clase, los nombres de los campos y la etiqueta.
Tu código debe estar en Employee.R y Manager.R. main.R contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
source("Employee.R")
source("Manager.R")
# Código de entrada/salida suministrado: mantenlo como está
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, " ")[[1]]
x <- if (p[1] == "manager") new_manager(p[2], as.numeric(p[3]), as.numeric(p[4])) else new_employee(p[2], as.numeric(p[3]))
cat("class: ", paste(class(x), collapse = ", "), "\n", sep = "")
cat("fields: ", paste(names(x), collapse = ", "), "\n", sep = "")
cat(label(x), "\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ímetro2S3 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