问题描述
说我有一个类SimpleClass
,该类的一个方法可以返回另一个类的对象,例如
SimpleClass <- R6::R6Class(
"SimpleClass",public = list(
initialize = function() {
private$a <- 1
},cls_two = function() SimpleClass2$new()
),private = list(
a = numeric()
)
)
SimpleClass2
在哪里
SimpleClass2 <- R6::R6Class(
"SimpleClass2",public = list(
initialize = function() {
private$b <- 2
},get_a = function() private$a
),private = list(
b = numeric()
)
)
在这里,如果我实例化SimpleClass
并调用方法cls_two()
,那么除非我将它们传递,否则生成的对象将无法访问第一个对象的元素。辅助类是否可以访问第一类的元素?
first <- SimpleClass$new()
second <- first$cls_two()
second$get_a()
# NULL
请注意,我不想使用传统意义上的继承,因为我不想重新实例化第一类。我也希望不必将所有对象都传递给SimpleClass2$new()
。
解决方法
您可以使SimpleClass2具有一个成员,该成员是Simpleclass,并可以选择在其构造函数中传递simpleclass:
SimpleClass <- R6::R6Class(
"SimpleClass",public = list(
initialize = function() {
private$a <- 1
},cls_two = function() SimpleClass2$new(self)
),private = list(
a = numeric()
)
)
SimpleClass2 <- R6::R6Class(
"SimpleClass2",public = list(
initialize = function(Simp1 = SimpleClass$new()) {
private$a <- Simp1
private$b <- 2
},get_a = function() private$a
),private = list(
a = SimpleClass$new(),b = numeric()
)
)
这是这样的:
first <- SimpleClass$new()
second <- first$cls_two()
second$get_a()
#> <SimpleClass>
#> Public:
#> clone: function (deep = FALSE)
#> cls_two: function ()
#> initialize: function ()
#> Private:
#> a: 1
,
扩展SimpleClass2
的构造函数以使用SimpleClass
类型的对象,并在self
中调用构造函数时传递SimpleClass::cls_two
:
SimpleClass2 <- R6::R6Class(
"SimpleClass2",public = list(
initialize = function(obj) {
private$b <- 2
private$obj <- obj
},get_a = function() private$obj
),private = list(
b = numeric(),obj = NULL
)
)