Menu
Coddy logo textTech

Métodos show

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

Quando um objeto S4 é impresso, R chama a função show(). Sem um método para a classe, ele lista cada slot, o que está correto, mas é longo:

setClass("Point", slots = c(x = "numeric", y = "numeric"))
p <- new("Point", x = 1, y = 2)
p

Saída:

An object of class "Point"
Slot "x":
[1] 1

Slot "y":
[1] 2

setMethod("show", "Point", function(object) ...) dá à classe sua própria impressão. O método imprime com cat() e é usado tanto quando um objeto é impresso no nível superior quanto por print():

setClass("Point", slots = c(x = "numeric", y = "numeric"))
setMethod("show", "Point", function(object) {
  cat("Point(", object@x, ", ", object@y, ")\n", sep = "")
})
p <- new("Point", x = 1, y = 2)
p
print(p)

Saída:

Point(1, 2)
Point(1, 2)

Um slot pode conter outro objeto S4: declare seu tipo como o nome da classe. O método show() externo pode imprimir o objeto interno chamando show() nele:

setClass("Point", slots = c(x = "numeric", y = "numeric"))
setMethod("show", "Point", function(object) cat("(", object@x, ", ", object@y, ")", sep = ""))
setClass("Line", slots = c(from = "Point", to = "Point"))
setMethod("show", "Line", function(object) {
  cat("line ")
  show(object@from)
  cat(" -> ")
  show(object@to)
  cat("\n")
})
new("Line", from = new("Point", x = 0, y = 0), to = new("Point", x = 3, y = 4))

Saída:

line (0, 0) -> (3, 4)

Uma classe virtual, declarada com representation("VIRTUAL"), não pode ser criada com new(). Ela existe para ser uma classe-pai comum para outras classes, conforme desenvolvido no capítulo sobre herança S4. isVirtualClass() distingue os dois tipos:

setClass("Shape", representation("VIRTUAL"))
setClass("Point", slots = c(x = "numeric"))
cat(isVirtualClass("Shape"), isVirtualClass("Point"), "\n")
msg <- tryCatch(new("Shape"), error = function(e) "cannot create a Shape")
cat(msg, "\n")

Saída:

TRUE FALSE 
cannot create a Shape 
challenge icon

Desafio

Fácil

Pontos e segmentos são duas classes S4 em dois arquivos. As classes estão declaradas. Adicione seus métodos show():

  • Em Point.R: um ponto é impresso como Point(1, 2), seguido por uma nova linha.
  • Em Segment.R: um segmento é impresso como Segment Point(1, 2) to Point(4, 6), length 5, seguido por uma nova linha, com o comprimento arredondado para duas casas decimais. Construa o texto do ponto por conta própria ou com um auxiliar; o método do ponto imprime sua própria nova linha, portanto não o chame no meio da linha do segmento.

O código fornecido lê linhas 1,2 4,6, imprime o primeiro ponto e, em seguida, o segmento, ambos por meio de seus métodos show().

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

Experimente você mesmo

source("Point.R")
source("Segment.R")

# Código de entrada/saída fornecido: mantenha-o como está
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
  n <- as.numeric(strsplit(line, "[ ,]")[[1]])
  a <- new("Point", x = n[1], y = n[2])
  b <- new("Point", x = n[3], y = n[4])
  print(a)
  print(new("Segment", from = a, to = b))
}
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