0

我目前正在迁移到 R,我想使用面向对象的设计。虽然我不确定我是否完全理解选择各种实现之一(S3、S4、参考类或 R.oo 包)的含义,但我还是决定使用 R.oo 包,主要是因为它似乎很好地对齐以我对 OOP 的基本理解,从其他编程语言中获得的。

我还利用这个机会对我的对象结构进行了彻底的检查,并且我不断回到这样一个事实,即多重继承将是创建我的许多类的最“自然”的方式。在 R.oo 中,继承是通过在构造函数中调用 extend() 来指定的,第一个参数是父类,所以我尝试在构造函数中调用 extend 两次以查看是否可以解决问题。它没。以下代码基于文档中的示例,重现了错误:

setConstructorS3("SavingsAccount", function(balance=0) {

  if (balance < 0)
    throw("Trying to create an account with a negative balance: ", balance);
  extend(Object(), "SavingsAccount",
         .balance = balance
  )
})


setConstructorS3("SavingsAccount2", function(balance=0) {

  if (balance < 0)
    throw("Trying to create an account with a negative balance: ", balance);
  extend(Object(), "SavingsAccount2",
         .balance2 = balance
  )
})

setConstructorS3("SavingsAccount3", function(balance=0) {

  if (balance < 0)
    throw("Trying to create an account with a negative balance: ", balance);
  extend(SavingsAccount2(balance), "SavingsAccount3"
         )
  extend(SavingsAccount(balance), "SavingsAccount3"
  )
})

这是一个非常愚蠢的例子,但它重现了错误。确实,当您这样做时:

SA = SavingsAccount3(23)

你得到 :

> SA$.balance2
NULL
> SA$.balance
[1] 23

这似乎意味着第二次调用 extend() 会覆盖第一次调用的结果。所以,我的问题是: - 是否可以使用 R.oo 包来做到这一点?(我知道 S4 可以) - 如果是,我应该在上面的代码中更改什么?

在此先感谢您的帮助

4

0 回答 0