Vettori di classe
Fa parte della sezione Programmazione orientata agli oggetti del percorso R di Coddy. Lezione 12 di 57.
L’ereditarietà S3 deriva dal vettore delle classi. Un oggetto con class = c("manager", "employee") è un manager e anche un employee. Quando un generico non ha un metodo per manager, il dispatch prosegue e usa il metodo 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))Output:
[1] "manager" "employee"
[1] 5000Scrivere a mano il vettore delle classi in ogni costruttore ripete i dettagli della classe genitore. Invece, il costruttore genitore accetta un argomento class e lo inserisce prima della propria classe, e il costruttore figlio chiama quello genitore:
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))Output:
[1] "manager" "employee"
[1] "name" "salary" "reports"... del costruttore genitore raccoglie i campi extra del figlio, qui reports, e li colloca dopo i campi propri del genitore. Un dipendente semplice non ha affatto il 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))Output:
[1] "employee"
[1] "name" "salary"L'ordine del vettore delle classi è importante: la classe più specifica viene per prima. Se la classe genitore viene prima, prevalgono i suoi metodi e quelli della classe figlia non vengono mai usati:
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))Output:
[1] "manager"
[1] "employee"Sfida
FacileDipendenti e manager sono suddivisi in due file. Completa new_employee(name, salary, ..., class = character()) in Employee.R: restituisce una lista con name, salary e tutti i campi aggiuntivi di ..., con il vettore di classi c(class, "employee"). Poi completa new_manager(name, salary, reports) in Manager.R, che chiama new_employee() con il campo aggiuntivo reports e la classe manager.
label() e il suo metodo employee sono forniti, quindi i manager ottengono un'etichetta senza avere un proprio metodo. Il codice fornito legge righe employee Bo 40000 oppure manager Ada 60000 4 e stampa il vettore di classi, i nomi dei campi e l'etichetta.
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")
# Supplied input/output code: keep it as it is
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 = "")
}
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 - Parcometro2Generics 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