Estendendo com contains
Parte da seção Programação Orientada a Objetos do Journey de R da Coddy. Lição 32 de 57.
contains = "Animal" transforma uma nova classe S4 em uma subclasse de Animal. A subclasse tem todos os slots de sua classe pai, além dos seus próprios, e new() recebe todos eles:
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)Saída:
[1] "breed" "name" "age"
Rex collieOs métodos escritos para a classe pai também funcionam para a classe filha. Quando um genérico não tem método para Dog, o S4 usa o método para 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")))Saída:
[1] "I am Rex"Uma classe filha substitui um método da classe pai definindo o seu próprio para o mesmo genérico. A classe mais específica vence, e as outras subclasses mantêm o método da classe pai:
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")))Saída:
woof ...is(x, "Animal") é TRUE para um cachorro, e um slot declarado como "Animal" aceita um Dog. O código escrito para a classe pai funciona com todas as subclasses:
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"))Saída:
TRUE TRUEDesafio
FácilFuncionários e gerentes são classes S4 em dois arquivos. Employee.R declara Employee (slots name, salary) e o genérico describe(), e precisa de um método para Employee que retorne Bo earns 40000. Em Manager.R, declare Manager, que contém Employee e adiciona o slot reports (numérico), e substitua describe() para que retorne Ada earns 60000 and manages 4.
O código fornecido lê linhas employee Bo 40000 ou manager Ada 60000 4 e imprime describe(), se o objeto é um funcionário e seus slots.
Seu código deve ficar em Employee.R e Manager.R. main.R contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
source("Employee.R")
source("Manager.R")
# Código de entrada/saída fornecido: mantenha-o 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 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ímetro7S4 Herança
Estendendo com containscallNextMethodClasses VirtuaisVerificando Tipos com is()Revisão - Cuidador do Zoológico2Gené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 LivrosPratique por conta própria: Compilador de R online