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