2016-05-26 30 views
6

Si consideri il seguente:R, R6 overloading degli operatori

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 

che getta un errore:

Warning: Incompatible methods ("+.ClassA", "+.ClassB") for "+" 
Error in a + b : non-numeric argument to binary operator 

Come può quanto sopra essere risolto, in modo che entrambi A e B può sovraccaricare l'operatore +, e essere aggiunto insieme.

risposta

5

pensato che avrei post la mia risposta, mi assegna la classe 'IAddable' ad entrambi i prototipi R6 (una specie di dichiarazione di interfaccia in altre lingue)

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

Poi possiamo assegnare un singolo operatore di overload, che si chiamerà da tutti gli oggetti che ereditano da questa dichiarazione di classe dell'interfaccia.

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

Questo funziona quindi come previsto:

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

a + b #WORKS, RETURNS a 
b + a #WORKS, RETURNS b 
Problemi correlati