Verificando com inherits()
Parte da seção Programação Orientada a Objetos do Journey de R da Coddy. Lição 15 de 57.
inherits(x, "employee") pergunta se employee está em alguma posição do vetor de classes de x, portanto é TRUE também para gerentes. Comparar com class(x) == "employee" verifica cada posição separadamente e produz um vetor, o que falha em um if:
m <- structure(list(), class = c("manager", "employee"))
print(inherits(m, "employee"))
print(inherits(m, "intern"))
print(class(m) == "employee")Saída:
[1] TRUE
[1] FALSE
[1] FALSE TRUEDado vários nomes, inherits() é TRUE quando o objeto possui qualquer um deles. Com which = TRUE, ele retorna, para cada nome, sua posição no vetor de classes, ou 0 quando ele está ausente:
p <- structure(list(), class = c("fragile", "express", "parcel"))
print(inherits(p, c("letter", "parcel")))
print(inherits(p, c("express", "letter", "parcel"), which = TRUE))Saída:
[1] TRUE
[1] 2 0 3Uma função que só faz sentido para uma família de classes verifica seu argumento com inherits() e interrompe com uma mensagem clara caso contrário:
raise <- function(x, pct) {
if (!inherits(x, "employee")) stop("raise() needs an employee", call. = FALSE)
x$salary <- x$salary * (1 + pct / 100)
x
}
m <- structure(list(salary = 50000), class = c("manager", "employee"))
print(raise(m, 10)$salary)
print(tryCatch(raise(list(salary = 1), 10), error = function(e) conditionMessage(e)))Saída:
[1] 55000
[1] "raise() needs an employee"Filter() com inherits() seleciona os membros de uma família de uma lista mista, incluindo todas as subclasses:
staff <- list(
structure(list(name = "Ada"), class = c("manager", "employee")),
structure(list(name = "Bo"), class = "employee"),
structure(list(name = "Cy"), class = c("intern", "employee")),
structure(list(name = "Dee"), class = c("director", "manager", "employee"))
)
managers <- Filter(function(x) inherits(x, "manager"), staff)
print(vapply(managers, function(x) x$name, character(1)))Saída:
[1] "Ada" "Dee"Desafio
FácilUm catálogo contém livros, ebooks e DVDs. Os construtores são fornecidos em Item.R, Book.R, Ebook.R e Dvd.R; um ebook tem a classe c("ebook", "book", "item"). Em Catalogue.R, complete duas funções com inherits():
count_of(items, kind)retorna quantos itens têmkindem qualquer posição do vetor de classes.titles_of(items, kind)retorna os títulos desses itens, na ordem em que aparecem.
O código fornecido lê as linhas book Dune, ebook Emma, dvd Alien e as consultas ? book, e imprime book: 2 (Dune, Emma), ou apenas dvd: 0 quando nada corresponde.
Seu código deve ficar em Item.R, Book.R, Ebook.R, Dvd.R e Catalogue.R. main.R contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
source("Item.R")
source("Book.R")
source("Ebook.R")
source("Dvd.R")
source("Catalogue.R")
# Código de entrada/saída fornecido: mantenha-o como está
input <- suppressWarnings(readLines(file("stdin")))
items <- list()
for (line in input) {
p <- strsplit(line, " ")[[1]]
rest <- paste(p[-1], collapse = " ")
if (p[1] == "?") {
titles <- titles_of(items, p[2])
shown <- if (length(titles) > 0) paste0(" (", paste(titles, collapse = ", "), ")") else ""
cat(p[2], ": ", count_of(items, p[2]), shown, "\n", sep = "")
} else {
items[[length(items) + 1]] <- switch(p[1], book = new_book(rest), ebook = new_ebook(rest), dvd = new_dvd(rest))
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos do S3
Trabalhando com ArquivosListas com uma ClasseFunções ConstrutorasMétodos de Impressão e FormataçãoValidadores e AuxiliaresRevisão - Temperaturas4Encapsulamento em R
Closures como ObjetosAmbientes como ObjetosFunções de AcessoProtegendo o EstadoRecapitulação - Parquímetro2Genéricos e Métodos S3
Genéricos e UseMethodMétodos padrãoMétodos para genéricos baseFundamentos de NextMethodRevisão - Áreas de formas5Classes S4
Definindo classes S4Slots e acessoVerificações de validadeMétodos showRevisão - Catálogo de produtos8Classes de Referência
Definindo Classes de ReferênciaMétodos e Atualizações de CamposSemântica de CópiaHerança e callSuperRecapitulação — Fila de Tarefas11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de Livros3Herança S3
Vetores de classeOrdem de busca de métodosEstendendo com NextMethodVerificando com inherits()Revisão - Folha de pagamento da equipePratique por conta própria: Compilador de R online