考虑以下:

A = R6::R6Class("ClassA")
B = R6::R6Class("ClassB")

`+.ClassA` = function(o1,o2) o1 #Trivial Example, Usually do something
`+.ClassB` = function(o1,o2) o1 #Trivial Example, Usually do something

a = A$new()
b = B$new()

a + b

这引发一个错误:
Warning: Incompatible methods ("+.ClassA", "+.ClassB") for "+"
Error in a + b : non-numeric argument to binary operator

上面的问题如何解决,所以AB都可以使+运算符重载,并将其添加在一起。

最佳答案

以为我会发布我的答案,我为这两个R6原型(prototype)都分配了'IAddable'类(类似于其他语言的接口(interface)声明)

A = R6::R6Class(c("ClassA","IAddable"))
B = R6::R6Class(c("ClassB","IAddable"))

然后,我们可以分配一个重载运算符,所有重载从此接口(interface)类声明继承的对象都将调用该运算符。
`+.IAddable` = function(o1,o2) o1 #Trivial Example, Usually do something

然后,这将按预期方式工作:
a = A$new()
b = B$new()

a + b  #WORKS, RETURNS a
b + a  #WORKS, RETURNS b

10-07 19:30
查看更多