我想使用R6强制方法返回特定的数据类型,这可能吗?
对于实例,请考虑以下因素:
A = R6::R6Class("ClassA",
public=list(
getx = function() as.integer(1)
)
)
B = R6::R6Class("ClassB",inherit=A,
public = list(
getx = function() "ABCDEF"
)
)
如果我想强制函数getx()
返回整数,则A的实例很好,但我想防止子类返回其他类型,例如B的情况。换句话说,我希望函数具有一致性无论返回结果是在哪里实现的,它都会返回。
您可以使用解决方法来做到这一点。直接是不可能的,间接使用第二个功能是可以的。
当您在“ ClassB”中定义新的“ getx”函数时,这将对Class A完全隐藏“ getx”函数。R6中没有机制来确保任何返回值都必须通过特定函数。
现在-您可以执行以下操作:
让ClassA中的getx成为公共函数。它所做的只是调用一个私有函数p_getx,该函数实际上返回值,而getx则将其强制转换为正确的类型。
然后,任何实现从ClassA继承来的ClassB的用户都将使公共函数getx保持不变,而是实现私有方法p_getx。这是“克隆”方法使用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"
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句