28 agosto, 2021
# 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
# 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
# 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) }
# 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) }
# 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
# 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
# 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