Menu
Coddy logo textTech

Definindo classes S4

Parte da seção Programação Orientada a Objetos do Journey de R da Coddy. Lição 22 de 57.

S4 é o sistema formal de objetos do R. setClass() declara uma classe com slots nomeados e o tipo de cada um, e new() cria um objeto. O operador @ lê um slot:

setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
cat(ada@name, "is", ada@age)

Saída:

Ada is 36

setClass() também retorna uma função geradora. Atribua-a a um nome, geralmente o nome da classe, e chame-a como um construtor:

Person <- setClass("Person", slots = c(name = "character", age = "numeric"))
bo <- Person(name = "Bo", age = 7)
print(bo@age + 1)
print(is(bo, "Person"))

Saída:

[1] 8
[1] TRUE

Ao contrário de S3, R verifica os slots. Um slot desconhecido ou um valor do tipo incorreto interrompe new() com um erro, portanto um objeto S4 sempre tem a estrutura que sua classe declara:

setClass("Person", slots = c(name = "character", age = "numeric"))
p <- new("Person", name = "Cy", age = "ten")

Saída:

Error in validObject(.Object) : 
  invalid class “Person” object: invalid object for slot "age" in class "Person": got class "character", should be or extend class "numeric"
Calls: new -> initialize -> initialize -> validObject
Execution halted

Um slot que não recebe um valor ganha um valor vazio de seu tipo, como character(0). prototype define valores padrão reais. Códigos mais antigos declaram os slots com representation(), o que significa o mesmo que slots:

setClass("Task", slots = c(title = "character", done = "logical"),
         prototype = list(done = FALSE))
setClass("Note", representation(text = "character"))
t <- new("Task", title = "Write report")
print(t@done)
print(length(new("Note")@text))

Saída:

[1] FALSE
[1] 0
challenge icon

Desafio

Fácil

Declare a classe S4 Book em Book.R com três slots: title e author do tipo character e pages do tipo numeric. Em seguida, complete book_label(b), que lê os slots com @ e retorna Dune by Frank Herbert (412 pages).

O código fornecido lê linhas title;author;pages, cria cada livro com new("Book", ...), imprime seu rótulo e, por fim, os nomes dos slots da classe.

Seu código deve estar em Book.R. main.R contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

source("Book.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]]
  b <- new("Book", title = p[1], author = p[2], pages = as.numeric(p[3]))
  cat(book_label(b), "\n", sep = "")
}
cat("slots: ", paste(slotNames("Book"), collapse = ", "), "\n", sep = "")
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de R online