实例化另一个R6类的R6类的访问元素

问题描述

我有一个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
  )
)