我目前正在迁移到 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 可以) - 如果是,我应该在上面的代码中更改什么?
在此先感谢您的帮助