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