【问题标题】:Enforce Return Type in Function在函数中强制返回类型
【发布时间】:2016-05-27 12:48:26
【问题描述】:

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

【问题讨论】:

    标签: r prototype enforcement r6


    【解决方案1】:

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

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

    【讨论】:

    • 以为解决方案是这样的,但是,不幸的是,用户仍然可以覆盖公共功能。如果 R6 有一些“钩子”会很好,这样每次调用公共函数时都可以调用“检查器”函数。不确定具体如何实现,或者即使可能。
    • @NicholasHamilton 我不太明白为什么你真的需要这些“检查器”功能。您的类的功能只能由实现您类的派生类的其他人更改。这与 R 中的其他所有内容一样 - 假设我们是成年人,人们可以在他们认为合适的时候覆盖和改变事物。您可以做的是提供一个“检查器”功能,有人可以将其应用于某个类以查看它是否符合您的规范。但我不太明白你为什么需要这种级别的锁定。在这种情况下,R 可能只是不适合您的语言。
    • 感谢您的评论,我正在处理的项目有一个深入而复杂的继承树,最终涉及许多动态文档,这些文档取决于每个 R6 对象中函数的输出(几乎每次的内容都不一样,但需要返回相同的结构)才能正确执行。没关系,我可以通过返回一个 R6 或 Structure 对象来解决这个问题,该对象具有一个强制提供所需元素的构造函数。
    猜你喜欢
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2018-11-23
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多