2

在 R6 中,如何在不创建生成器对象的实例的情况下获得类继承的完整列表?

考虑以下:

A = R6::R6Class("Base",NULL)
B = R6::R6Class("Top",inherit = A)
class(B)     #Returns 'R6ClassGenerator'
B$classname  #Returns 'Top' 

我想要的是c('Top','Base','R6')

换句话说,否则会返回class(B$new())

在现实世界中,我有一组复杂的继承,以及带有许多参数的初始化程序,其中一些没有默认值,所以我试图避免实例化一个新对象以获取这些信息。

4

1 回答 1

6

没有一种内置方法可以在不调用 B 的情况下找到 B 继承的所有类B$new()。这是因为继承是在实例化对象时确定的,而不是在创建类时确定的。一个类(AKA 生成器对象)知道它继承自的类的名称,但只有在实例化对象时才会评估该名称。

您可以执行类似的操作来查找继承链,但这会使用一些内部 API,这些 API 在未来可能会发生变化(尽管它们可能不会):

findClasses <- function(x) {
  if (is.null(x))
    return(NULL)
  parent <- x$get_inherit()
  c(x$classname, findClasses(parent))
}

A <- R6::R6Class("Base",NULL)
B <- R6::R6Class("Middle", inherit = A)
C <- R6::R6Class("Top", inherit = B)
findClasses(C)
#> [1] "Top"    "Middle" "Base"  
于 2016-05-18T20:31:56.547 回答