28 agosto, 2021

Selo DC

POO: Sistema S3

Ideia inicial do mecanismo de herança

# Generico
fgenerica <- function(x, ...) UseMethod("fgenerica")
# Metodo 1
fgenerica.clas1 <- function(x, z = faux(), ...) {
  x <- 3;  y <- 5
  NextMethod(generic = .Generic, object = x, y, z)
  cat("Passei pelo metodo 1")
}
# Metodo 2
fgenerica.clas2 <- function(x, y, ...) {
  cat("Chegando no metodo 2, consigo imprimir x:", x, "e y:", y, "\n")
}
############
# Instancia (Objeto)
x <- structure(2, class = c("clas1", "clas2"))
# Despacho:
sloop::s3_dispatch(fgenerica(x))
## => fgenerica.clas1
## -> fgenerica.clas2
##    fgenerica.default

Ideia inicial do mecanismo de herança

# Instancia (Objeto)
x <- structure(2, class = c("clas1", "clas2"))
# Despacho:
sloop::s3_dispatch(fgenerica(x))
## => fgenerica.clas1
## -> fgenerica.clas2
##    fgenerica.default
# Executando a funcao generica
fgenerica(x)
## Chegando no metodo 2, consigo imprimir x: 3 e y: 5 
## Passei pelo metodo 1

Exemplo prático do mecanismo de herança

  • Construtor
  • Subclasses e superclasses
  • classes públicas e privadas
# Construtor
new_intparord <- function(x, ..., inteiro = FALSE, ordenado = FALSE) {
  stopifnot(is.numeric(x))
  classe = c("par", "ordenado", "inteiro")
  if (inteiro) {
    classe <- c("inteiro")
  }
  if (ordenado) {
    classe = c("ordenado", "inteiro")
  }
  structure(x, class = classe)
}

Exemplo prático do mecanismo de herança

# Método inteiro para o generico print
print.par <- function(x, ...) {
  NextMethod(.Generic, x = x[!as.logical(trunc(x) %% 2)])
}
# Método ordenado para o generico print
print.ordenado <- function(x, ...) {
  NextMethod(.Generic, x = sort(x))
}
# Método inteiro para o generico print
print.inteiro <- function(x, ...) {
  attributes(x) <- NULL
  print(as.integer(x))
  invisible(x)
}

Exemplo prático do mecanismo de herança

# Objeto com a classe desejada
x <- new_intparord(x = 10:1); x
## [1]  2  4  6  8 10
# Despacho
sloop::s3_dispatch(print(x))
## => print.par
## -> print.ordenado
## -> print.inteiro
##  * print.default

Exemplo prático do mecanismo de herança

# Objeto com a classe desejada
x <- new_intparord(x = 10:1, ordenado = TRUE); x
##  [1]  1  2  3  4  5  6  7  8  9 10
# Despacho
sloop::s3_dispatch(print(x))
## => print.ordenado
## -> print.inteiro
##  * print.default

Exemplo prático do mecanismo de herança

# Objeto com a classe desejada
x <- new_intparord(x = 10:1, inteiro = TRUE); x
##  [1] 10  9  8  7  6  5  4  3  2  1
# Despacho
sloop::s3_dispatch(print(x))
## => print.inteiro
##  * print.default

Bons estudos!