您可以使用解决方法来做到这一点。直接不可能,间接使用第二个功能,它是。
当您在“ClassB”中定义新的“getx”函数时,这完全隐藏了 Class A 中的函数“getx”。R6 中没有机制来确保任何返回值都必须通过特定的函数。
现在 - 您可以执行以下操作:
让来自 ClassA 的 getx 成为公共函数。它所做的只是调用一个实际返回值的私有函数 p_getx,而 getx 只是将它强制转换为正确的类型。
然后,任何实现从 ClassA 继承的 ClassB 的用户都将保持公共函数 getx 不变,而是实现私有方法 p_getx。这是 'clone' 方法使用 wrt 私有 'deep_clone' 方法的模型。
一些示例代码
ClassA <- R6Class("ClassA",
public=list(
getx = function() {
return(as.character(private$p_getx()))
}
),
private=list(
p_getx = function() {
return("ClassA")
}
)
)
ClassB <- R6Class("ClassB", inherit = ClassA,
private=list(
p_getx = function() {
return(factor("ClassB"))
}
)
)
obj_A <- ClassA$new()
obj_B <- ClassB$new()
带输出
> obj_A$getx()
[1] "ClassA"
> class(obj_A$getx())
[1] "character"
> obj_B$getx()
[1] "ClassB"
> class(obj_B$getx())
[1] "character"