使用R6,我想强制一个方法返回一个特定的数据类型,这可能吗?
对于Instance,请考虑以下事项:
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的情况。换句话说,我希望函数在返回的内容中保持一致,无论它实际在何处实现。
答案 0 :(得分:1)
您可以通过解决方法执行此操作。直接使用第二个函数是不可能的,它是。
当你定义新的" getx"函数" ClassB",这完全隐藏了函数" getx"来自A类.R6中没有机制来确保任何返回值必须通过特定的函数。
现在 - 你可以做的是:
让来自ClassA的getx成为公共函数。它只是调用一个实际返回值的私有函数p_getx,而getx只是将它强制转换为正确的类型。
然后,实现继承自ClassA的ClassB的任何用户都将保持公共函数getx不变,而是实现私有方法p_getx。这就是克隆'方法使用w.r.t.私人' 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"