2016-05-26 16 views
6

निम्नलिखित पर विचार करें:आर, 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 

ऊपर कैसे हल किया जा सकता है, तो दोनों A और B+ ऑपरेटर को ओवरलोड कर सकते हैं और एक साथ जोड़ा जाना चाहिए।

उत्तर

5

सोचा मैं अपने उत्तर पोस्ट हैं, मैं दोनों R6 प्रोटोटाइप करने के लिए वर्ग 'IAddable' आवंटित

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 
संबंधित मुद्दे