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

Access elements of an R6 class that instantiates another R6 class

假设我有一个 class SimpleClass 并且 class 的方法之一可以 return 另一个 class 的对象,例如

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(),生成的对象将无法访问第一个对象的元素,除非我传递它们。有没有办法让第二个 class 访问第一个 class 的元素?

first <- SimpleClass$new()
second <- first$cls_two()
second$get_a()
# NULL

请注意,我不想使用传统意义上的继承,因为我不想重新实例化第一个 class。我也不想将所有对象传递给 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类型的对象,调用SimpleClass::cls_two中的构造函数时传递self:

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
  )
)