9

考虑以下:

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可以重载+运算符,并相加。

4

1 回答 1

9

以为我会发布我的答案,我将类分配'IAddable'给两个 R6 原型(有点像其他语言中的接口声明)

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

然后我们可以分配一个重载运算符,所有继承自该接口类声明的对象都会调用该运算符。

`+.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
于 2016-05-27T09:35:56.410 回答