在 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())
在现实世界中,我有一组复杂的继承,并且有很多参数的初始化器,有些没有默认值,所以我试图避免实例化一个新对象来获取这些信息。
最佳答案
不调用 B$new()
就没有找到 B 继承的所有类的内置方法。这是因为继承是在实例化对象时确定的,而不是在创建类时确定的。一个类(也称为生成器对象)知道它所继承的类的名称,但只有在实例化对象时才会评估该名称。
您可以执行类似这样的操作来查找继承链,但这使用了一些将来可能会更改的内部 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"
关于R,R6,从 R6Generator 对象获取完整的类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37303552/