2016-05-26 45 views
6

考慮以下幾點:R,R6運算符重載

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可以重載+運營商,以及加在一起。

回答

5

以爲我會發布我的回答,我的類'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