2016-05-26 7 views
6

Beachten Sie Folgendes:R, R6 Überladen von Operatoren

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 

, die einen Fehler wirft:

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

Wie kann die oben gelöst werden, so dass beide A und B den + Betreiber überlasten, und zusammen addiert werden.

Antwort

5

dachte, ich würde meine Antwort veröffentlichen, ordne ich die Klasse 'IAddable' sowohl R6 Prototypen (Art wie Interface-Deklaration in anderen Sprachen)

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

Dann können wir einen einzigen überladenen Operator zuweisen, die aufgerufen wird, von allen Objekten, die von dieser Interface-Class-Deklaration erben.

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

Dies funktioniert dann wie erwartet:

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

a + b #WORKS, RETURNS a 
b + a #WORKS, RETURNS b 
Verwandte Themen