This function gets the parent class or the next class based on the method resolution order. This is useful when one wants to access the overwritten parent class method or the overwritten parent class attribute.
Arguments
- self_name
Character. The name of the self reference.
- mro_current_name
Character. The name of the variable storing the current class. This is used to determine the next class.
- where
Environment/Character. The target environment to search for the parent class. If
where == NULL
, the parent environment of self will be used. If a character value is provided, the package with the same name will be used.
Details
Note that this function assumes the parent class can be found in the
parent environment of the current object. If one wants to find the
parent class from a package, it needs to be specified via the where
argument.
Examples
# Define class O
O <- new_class(class_name = "O")
register_method(O, foo = function() {
print("Calling class O `foo` method")
print(paste0("Self is ", self$my_name))
print(paste0("Next class is ", super()$..type..))
})
# Define class F
F <- new_class(O, class_name = "F")
register_method(F, foo = function() {
print("Calling class F `foo` method")
print(paste0("Self is ", self$my_name))
print(paste0("Next class is ", super()$..type..))
use_method(self, super()$foo)()
})
# Define class E
E <- new_class(O, class_name = "E")
register_method(E, foo = function() {
print("Calling class E `foo` method")
print(paste0("Next class is ", super()$..type..))
use_method(self, super()$foo)()
})
# Define class D
D <- new_class(O, class_name = "D")
register_method(D, foo = function() {
print("Calling class D `foo` method")
print(paste0("Self is ", self$my_name))
print(paste0("Next class is ", super()$..type..))
use_method(self, super()$foo)()
})
# Define class C
C <- new_class(D, F, class_name = "C")
register_method(C, foo = function() {
print("Calling class C `foo` method")
print(paste0("Self is ", self$my_name))
print(paste0("Next class is ", super()$..type..))
use_method(self, super()$foo)()
})
# Define class B
B <- new_class(E, D, class_name = "B")
register_method(B, foo = function() {
print("Calling class B `foo` method")
print(paste0("Self is ", self$my_name))
print(paste0("Next class is ", super()$..type..))
use_method(self, super()$foo)()
})
# Define class A
A <- new_class(B, C, class_name = "A")
register_method(A, foo = function() {
print("Calling class A `foo` method")
print(paste0("Self is ", self$my_name))
print(paste0("Next class is ", super()$..type..))
use_method(self, super()$foo)()
})
# To understand why the order is A, B, E, C, D, F, O,
# please check [https://www.python.org/download/releases/2.3/mro/].
a <- A$instantiate()
a$my_name <- "a"
a$foo()
#> [1] "Calling class A `foo` method"
#> [1] "Self is a"
#> [1] "Next class is B"
#> [1] "Calling class B `foo` method"
#> [1] "Self is a"
#> [1] "Next class is E"
#> [1] "Calling class E `foo` method"
#> [1] "Next class is C"
#> [1] "Calling class C `foo` method"
#> [1] "Self is a"
#> [1] "Next class is D"
#> [1] "Calling class D `foo` method"
#> [1] "Self is a"
#> [1] "Next class is F"
#> [1] "Calling class F `foo` method"
#> [1] "Self is a"
#> [1] "Next class is O"
#> [1] "Calling class O `foo` method"
#> [1] "Self is a"
#> [1] "Next class is BASE"