2016-05-27 72 views
1

使用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的情况。换句话说,我希望函数在返回的内容中保持一致,而不管它实际实现的位置。

回答

1

您可以使用解决方法来做到这一点。直接这是不可能的,间接使用第二个功能,它是。

当您在“ClassB”中定义新的“getx”函数时,这完全隐藏了A类函数“getx”。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" 
+0

想到的解决办法是这样的事情,然而,不幸的是,用户仍然可以覆盖公共职能。如果R6有一些“钩子”,这样可以很好,这样每次调用公共函数时都可以调用“检查器”函数。不确定如何实现这一点,或者即使有可能。 –

+0

@NicholasHamilton我不太明白你为什么需要这些“检查”功能。你的类的功能只能由其他人实现派生类的类来改变。在那里它与R中的其他一切一样 - 假定我们是成年人,人们可以按照他们认为合适的方式推翻和改变事物。你可以做的是提供一个“检查器”功能,有人可以向班级申请,看看它是否符合你的规格。但我不太明白你为什么需要这个级别的锁定。在这种情况下,R可能只是你的错误语言。 –

+0

谢谢感谢您的评论,我为我正在开发的一个项目提供了一个深度复杂的继承树,最终涉及许多动态文档,这些动态文档取决于每个R6对象内的函数输出(其内容几乎每次是不同的,但需要返回相同的结构)以便无误地执行。没关系,我可以通过返回一个R6或Structure对象来解决这个问题,该对象具有一个强制提供所需元素的构造方法。 –