## ------------------------------------------------------------------------
library("aoos")
# Standard definition for a generic without default:
numeric : strLength(x, ...) %g% standardGeneric("strLength")
# A method for x:character
strLength(x ~ character, ...) %m% { nchar(x) }
# Kind of the default method for x:ANY
strLength(x ~ ANY, ...) %m% { strLength(as.character(x)) }
# Check that it works:
strLength(123)
strLength("ab")
## ------------------------------------------------------------------------
Test(x ~ numeric, y = list()) %type% {
stopifnot(length(.Object@x) == 1)
stopifnot(.Object@x > 0)
.Object
}
Test : character : Child() %type% .Object
Test(2)
Child("Hej", x = 2)
## ------------------------------------------------------------------------
'numeric | character' : Either() %type% .Object
Either(1)
Either("Hello World!")
## ------------------------------------------------------------------------
Either(x ~ numeric | character) %type% .Object
Either(1)
Either("Hello World!")
## ------------------------------------------------------------------------
'numeric | character' : complicatedFunction(x = 1) %g% as.character(x)
complicatedFunction(x ~ character | integer) %m% as.numeric(x)
complicatedFunction()
complicatedFunction("1")
complicatedFunction(1L)
## ------------------------------------------------------------------------
library("aoos")
Employee <- function(.name, .salary) {
"Common base class for all employees"
print <- function(x, ...) {
cat("Name : ", .self$.name, "\nSalary: ", .self$.salary)
}
getName <- function() .name
getSalary <- function() .self$.salary
retList(c("Employee", "Print"))
}
peter <- Employee("Peter", 5)
peter
peter$getName()
peter$getSalary()
## ------------------------------------------------------------------------
peter
peter$print()
## ------------------------------------------------------------------------
Manager <- function(.name, .salary, .bonus) {
"Extending the Employee class"
bonus <- function(x) {
if (!missing(x)) .self$.bonus <- x
.self$.bonus
}
print <- function(x, ...) {
cat("Name : ", .self$.name, "\nSalary: ", .self$.salary,
"\nBonus:", .self$.bonus)
}
retList("Manager", super = Employee(.name, .salary))
}
julia <- Manager("Julia", 5, 5 * 1e6)
julia
julia$getSalary()
julia$bonus(10)
julia
## ------------------------------------------------------------------------
Class <- function() {
overloaded(x) %g% {
cat("This is the default ... \n")
x
}
overloaded(x ~ numeric) %m% {
cat("This is the method for 'numeric' values ... \n")
x
}
retList("Class")
}
instance <- Class()
instance$overloaded(1)
instance$overloaded("a")
## ------------------------------------------------------------------------
Child <- function() {
# Normally you would make the call to the parents constructor in the call
# to retList. But here we need to access the elements directly during init...
.super <- Class()
# This points %m% to the generic (in .super) which should be extended:
.super$overloaded(x ~ integer) %m% {
cat("This is the method for 'integer' values ... \n")
x
}
retList("Child", super = .super)
}
instance <- Child()
instance$overloaded(1)
instance$overloaded("a")
instance$overloaded(1L)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.