如何从ctor中具有强制参数的类继承?

时间:2014-02-19 14:53:45

标签: r oop reference-class

似乎如果我们创建一个继承自类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

这看起来很奇怪 - 为什么会发生这种情况,我该怎么办呢?

1 个答案:

答案 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"))