似乎如果我们创建一个继承自类B
的类A
,则在创建A
时会调用B
的构造函数。这会导致以下问题 - A
可能在其ctor中有一个必需参数(在实例化期间使用),因此运行以下内容:
A <- setRefClass("A",
methods = list(
initialize = function(mandatoryArg) {
print(mandatoryArg)
}
)
)
B <- setRefClass("B", contains = "A")
我收到错误
Error in .Object$initialize(...) :
argument "mandatoryArg" is missing, with no default
这看起来很奇怪 - 为什么会发生这种情况,我该怎么办呢?
答案 0 :(得分:1)
隐式要求是没有参数的构造函数(例如A()
)成功,因此为mandatoryArg
提供默认值
A <- setRefClass("A",
methods = list(
initialize = function(mandatoryArg=character()) {
print(mandatoryArg)
}
)
)
或(推荐)避免使用initialize
方法进行构建,而是定义一个用户友好的包装器
.A <- setRefClass("A", fields=list(mandatoryField="character"))
A <- function(mandatoryArg, ...) {
if (missing(mandatoryArg))
stop("'mandatoryArg' missing")
.A(mandatoryField=mandatoryArg, ...)
}
.B <- setRefClass("B", contains="A")
B <- function()
.B()
或B <- function() .B(mandatoryField="foo")
或B <- function() .B(A("mandatoryField"))