new_square <- function(side) {
structure(list(side = side),
class = "Square")
}
# Computed property: a function of the object
area <- function(x) UseMethod("area")
area.Square <- function(x) x$side * x$side
# Its setter: a replacement function
`area<-` <- function(x, value) {
UseMethod("area<-")
}
`area<-.Square` <- function(x, value) {
x$side <- sqrt(value)
x
}
square <- new_square(2)
square_area <- area(square)
# square_area = 4
# The same as square <- `area<-`(square, 9)
area(square) <- 9
# square$side = 3
cat("square_area =", square_area, "\n")
cat("square$side =", square$side, "\n")