15.4 Adding Members to a Class
Sometimes we need to add or to modify a member of a class, after we have defined that class. Every class comes with a set()
method that allows us to do this. For example, suppose that we would like our people to have a favorite color:
$set("public", "color", NA, overwrite = TRUE) Person
We now see that color
is now one of the public members of class Person:
Person
## <Person> object generator
## Public:
## name: NULL
## age: NULL
## desire: NULL
## color: NA
## initialize: function (name = NA, age = NA, desire = NA)
## set_age: function (val)
## set_desire: function (val)
## greet: function ()
## clone: function (deep = FALSE)
## Parent env: <environment: R_GlobalEnv>
## Locked objects: TRUE
## Locked class: FALSE
## Portable: TRUE
In the above call to set, the argument overwrite = TRUE
was not strictly necessary, since color
did not previously exist as a member of Person. If you are developing a program, though, and you find yourself repeatedly running a piece of code that sets a new member for a class, it’s useful to have overwriting turned on.
While we are at it. let’s write a special set_color()
method:
$set("public", "set_color", function(val) {
Person$color <- val
selfcat(self$name, " has favorite color: ", val, ".\n", sep = "")
overwrite = TRUE) },
You might think that we can now set a favorite color for dorothy
:
$set_color("blue") dorothy
Error: attempt to apply non-function
Why did this not work? It turns out that when you add a new member to a class it is only available to instances of the class that are created after the new member is added to that class. If we create a new instance of Person, the Good Witch Glinda, let’s say, then we should be able to give her a favorite color:
<- Person$new("Glinda", "500", "the good of all") glinda
## Hello, my name is Glinda.
$set_color("blue") glinda
## Glinda has favorite color: blue.