【问题标题】:Defining and implementing interfaces in R在 R 中定义和实现接口
【发布时间】:2018-07-12 06:36:38
【问题描述】:

我对定义和继承R 中的接口感兴趣。所谓接口,我指的是 OOP 接口。我知道R 支持类扩展。此链接http://adv-r.had.co.nz/OO-essentials.html 给出了在R 中扩展引用类的示例。它定义了一个扩展Account 引用类的NoOverdraftAccount 引用类。

我希望能够定义一个帐户接口IAccount,而不是扩展Account 引用类。我希望NoOverDraftAccount 实现IAccount,这样:

  • NoOverDraftAccount 必须实现IAccount 中的所有方法。
  • NoOverDraftAccount 不能声明任何尚未在 IAccount 中声明的新 public 方法。
  • NoOverDraftAccount可以声明私有方法和属性。

实现这一目标的最佳方法是什么?

我最接近答案的是问题Multiple inheritance for R6 classes。但是,问题不在于接口。

感谢您的宝贵时间。

【问题讨论】:

    标签: r oop interface


    【解决方案1】:

    我认为“声明”在像 R 这样的解释性语言中没有多大意义。由于没有编译步骤,如果不在类上运行函数,就无法测试某些东西是否真正符合声明的接口,比如 @ 987654321@,在某个时候。

    所以我认为你必须从头开始——你需要定义一个接口规范类并编写does_class_follow 函数。

    我的第一个想法是,一个类必须知道它符合什么接口,以便测试可以反省这一点,但也许这是错误的,你应该有一个接口定义和伪声明的文件来测试所有内容.

    例如,有一些文件interfaces.R,看起来像:

     IAccount = Interface(
         public = list("deposit","withdraw")
     )
    
     Implements(Account, IAccount)
     Implements(Account, NoOverDraftAccount)
    

    然后,当加载包时,那些Implements 函数将运行并根据帐户接口规范测试这些类。是在加载时测试还是将这些东西放在./test/ 文件夹中并在测试时使用test_that 或其他测试系统测试它们是一个问题......

    您可能知道,您必须为您要使用的 R 中的所有 OO 系统单独实现此功能 - S3、S4、R5、ReferenceClasses、R6、proto、R.oo 和所有其他我忘记了……

    【讨论】:

    • 嗨@Spacedman,这是一个很好的答案!我可以澄清一下你所说的 implements 属性是什么意思吗?
    • 重新考虑,也许更新的答案是一个更好的主意。
    猜你喜欢
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2017-07-09
    • 2018-07-17
    • 1970-01-01
    • 2011-06-05
    相关资源
    最近更新 更多