जावा ऑपरेटर ओवरलोडिंग की पेशकश क्यों नहीं करता है?


405

C ++ से जावा में आ रहा है, स्पष्ट अनुत्तरित प्रश्न है कि जावा में ऑपरेटर ओवरलोडिंग क्यों शामिल नहीं है?

Complex a, b, c; a = b + c;से ज्यादा सरल नहीं है Complex a, b, c; a = b.add(c);?

क्या इसका एक ज्ञात कारण है, के लिए मान्य तर्क ऑपरेटर को ओवरलोडिंग की अनुमति नहीं देने के ? क्या कारण मनमाना है, या समय के लिए खो गया है?



1
@zzzz, मेरे पास उस लेख को पढ़ने का कठिन समय है। क्या यह ऑटो-अनुवादित था, या अंग्रेजी लेखक की दूसरी भाषा है? मुझे लगता है कि यहां चर्चा ज्यादा साफ-सुथरी होगी।

25
लोगों के ढेर पर यह रचनात्मक नहीं के रूप में बंद करने के लिए, इस सवाल से सबसे अधिक रचनात्मक संवाद मैंने एसओ में देखा है। शायद यह programmers.stackexchange.com के लिए एक बेहतर उम्मीदवार है , लेकिन कई बार मुझे लगता है कि एसओ व्यापक विषयों को खारिज कर रहा है।

@NoNaMe यह आसान है, बस मानसिक रूप से एक सम्मिलित करें - और लापता कलाकृतियां एक मृत जीव है कि व्यक्ति या तो एक देशी अंग्रेजी वक्ता या प्रोग्रामर नहीं है (या इस आदमी की तरह, दोनों :) कारण प्रोग्रामर ड्रॉप कर सकते हैं लेख है कि यह कर सकते हैं प्रदान की गई जगह में टिप्पणियों को कम और आसान बनाएं। वहां से, उन्हें बस इसकी आदत हो जाती है। मेरी समस्या लेआउट के साथ है, किसी तरह मैं हमेशा उस साइट को Google खोजों में मार रहा हूं। सौभाग्य से एक महान क्रोम एक्सटेंशन है जिसे स्पष्ट रूप से कहा जाता है कि सुधारकों को पृष्ठों को आश्चर्यजनक रूप से पढ़ने के लिए कठिन है।
ymc

1
मुझे कोई कारण नहीं दिख रहा है कि ओपी ने पहला उत्तर क्यों और कैसे स्वीकार किया? @ Stackoverflow.com/users/14089/paercebal द्वारा लिखित उत्तर उत्कृष्ट है। इसे स्वीकार किया जाना चाहिए।
नाशक

जवाबों:


13

मान लें कि आप द्वारा संदर्भित ऑब्जेक्ट के पिछले मूल्य को अधिलेखित करना चाहते हैं a, तो एक सदस्य फ़ंक्शन को आमंत्रित करना होगा।

Complex a, b, c;
// ...
a = b.add(c);

C ++ में, यह अभिव्यक्ति कंपाइलर को स्टैक पर तीन (3) ऑब्जेक्ट बनाने के लिए कहती है, अतिरिक्त प्रदर्शन करती है, और परिणामी मान को अस्थायी ऑब्जेक्ट से मौजूदा ऑब्जेक्ट में कॉपी करती है।a

हालाँकि, जावा में, operator=संदर्भ प्रकारों के लिए मान कॉपी नहीं करता है, और उपयोगकर्ता केवल नए संदर्भ प्रकार बना सकते हैं, मूल्य प्रकार नहीं। उपयोगकर्ता नाम परिभाषित प्रकार के लिए Complex, असाइनमेंट का अर्थ मौजूदा मूल्य के संदर्भ को कॉपी करना है।

इसके बजाय विचार करें:

b.set(1, 0); // initialize to real number '1'
a = b; 
b.set(2, 0);
assert( !a.equals(b) ); // this assertion will fail

C ++ में, यह मान कॉपी करता है, इसलिए तुलना न के बराबर होगी। जावा में, operator=संदर्भ प्रतिलिपि निष्पादित करता है, इसलिए aऔर bअब उसी मूल्य का उल्लेख कर रहे हैं। नतीजतन, तुलना 'बराबर' का उत्पादन करेगी, क्योंकि ऑब्जेक्ट खुद के बराबर तुलना करेगा।

प्रतियों और संदर्भों के बीच का अंतर केवल ऑपरेटर ओवरलोडिंग के भ्रम को जोड़ता है। जैसा कि @ सिबस्टियन ने उल्लेख किया है, जावा और सी # दोनों को अलग-अलग मूल्य और संदर्भ समानता operator+के साथ सौदा करना होगा - संभवतः मूल्यों और वस्तुओं के साथ सौदा होगा, लेकिन operator=संदर्भों से निपटने के लिए पहले से ही लागू है।

C ++ में, आपको एक समय में केवल एक प्रकार की तुलना के साथ काम करना चाहिए, इसलिए यह कम भ्रमित हो सकता है। उदाहरण के लिए, पर Complex, operator=और operator==दोनों मूल्यों पर काम कर रहे हैं - मूल्यों की प्रतिलिपि बनाना और क्रमशः मूल्यों की तुलना करना।


6
यह वास्तव में बहुत आसान है ... बस पायथन की तरह है और कोई अतिभारित असाइनमेंट नहीं है।
L --o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e

225
यह उत्तर प्रश्न का उत्तर नहीं देता है। आप बस जावा पर समान चिन्ह के उपयोग से हानि पहुँचा रहे हैं। यदि b + C ने नया कॉम्प्लेक्स लौटाया, तो a = b + c पूरी तरह से मान्य होगा, और हां पढ़ने में बहुत सरल होगा। यहां तक ​​कि अगर आप एक जगह को संशोधित करना चाहते हैं, तो a.set (b + c) पढ़ने के लिए एक टन सरल है - खासकर जब अंकगणित तुच्छ से अधिक है: a.set ((a + b c b ) / 5) या a = a.multiply (b) .add (b.multiply (c))। divide (5)। आपकी पसंद ..
BT

24
या मुझे लगता है .. आपकी पसंद नहीं, जैसा कि मामला हो सकता है
बीटी

9
C ++ में, एक्सप्रेशन टेम्प्लेट अतिरिक्त कॉपी की समस्या को हल करते हैं। बहुत अधिक सभी प्रमुख अंकगणितीय पुस्तकालय इस कारण से इस तकनीक का उपयोग करते हैं। इसके अलावा, यह प्रश्न को संबोधित नहीं करता है, क्योंकि a = b + c केवल a.foo (b.bar (c)) के लिए सिंटैक्टिक शुगर है, जो वास्तव में प्रश्न में प्रारंभिक अवलोकन है।
कज़ ड्रैगन ड्रैगन

18
यह पूछे गए सवाल का जवाब नहीं है। यह जावा और C ++ के बीच कुछ अंतरों पर किसी की अटकलें हैं।
SChepurin

803

ऑपरेटर ओवरलोडिंग के बारे में शिकायत करने वाले बहुत सारे पद हैं।

मुझे लगा कि मुझे "ऑपरेटर ओवरलोडिंग" अवधारणाओं को स्पष्ट करना होगा, इस अवधारणा पर एक वैकल्पिक दृष्टिकोण प्रस्तुत करना होगा।

कोड को बाधित कर रहा है?

यह तर्क एक पतन है।

सभी भाषाओं में विरोध संभव है ...

यह कार्य / विधियों के माध्यम से C या Java में कोड को आबंटित करना उतना ही आसान है जितना कि ऑपरेटर ओवरलोड के माध्यम से C ++ में है:

// C++
T operator + (const T & a, const T & b) // add ?
{
   T c ;
   c.value = a.value - b.value ; // subtract !!!
   return c ;
}

// Java
static T add (T a, T b) // add ?
{
   T c = new T() ;
   c.value = a.value - b.value ; // subtract !!!
   return c ;
}

/* C */
T add (T a, T b) /* add ? */
{
   T c ;
   c.value = a.value - b.value ; /* subtract !!! */
   return c ;
}

... जावा के मानक इंटरफेस में भी

एक अन्य उदाहरण के लिए, आइए जावा में Cloneableइंटरफेस देखें :

आप इस इंटरफ़ेस को लागू करने वाले ऑब्जेक्ट को क्लोन करने वाले हैं। लेकिन आप झूठ बोल सकते थे। और एक अलग वस्तु बनाएं। वास्तव में, यह इंटरफ़ेस इतना कमजोर है कि आप किसी अन्य प्रकार की वस्तु को पूरी तरह से वापस कर सकते हैं, बस इसके मज़े के लिए:

class MySincereHandShake implements Cloneable
{
    public Object clone()
    {
       return new MyVengefulKickInYourHead() ;
    }
}

के रूप में Cloneable इंटरफ़ेस का दुरुपयोग किया जा सकता है / बाधित किया जा सकता है, क्या इसे उसी आधार पर प्रतिबंधित किया जाना चाहिए C ++ ऑपरेटर ओवरलोडिंग माना जाता है?

हम toString()एक MyComplexNumberवर्ग की विधि को ओवरलोड कर सकते हैं ताकि यह दिन के कड़े घंटे को वापस कर सके। क्या toString()ओवरलोडिंग पर भी रोक लगनी चाहिए? हम तोड़फोड़ कर सकते हैं MyComplexNumber.equalsकि यह एक यादृच्छिक मूल्य लौटाए, ऑपरेंड को संशोधित करें ... आदि आदि।

जावा में, सी ++ की तरह, या जो भी भाषा में, प्रोग्रामर को कोड लिखते समय न्यूनतम शब्दार्थ का सम्मान करना चाहिए। इसका अर्थ है एक addफ़ंक्शन को लागू करना , जो जोड़ता है, और Cloneableकार्यान्वयन विधि जो क्लोन, और ए++ वेतन वृद्धि की तुलना में ऑपरेटर है।

वैसे भी क्या बात है?

अब जब हम जानते हैं कि कोड को प्राचीन जावा विधियों के माध्यम से भी तोड़फोड़ किया जा सकता है, तो हम खुद को C ++ में ऑपरेटर ओवरलोडिंग के वास्तविक उपयोग के बारे में पूछ सकते हैं?

स्पष्ट और प्राकृतिक संकेतन: तरीके बनाम ऑपरेटर ओवरलोडिंग?

हम नीचे की तुलना करेंगे, विभिन्न मामलों के लिए, जावा और सी ++ में "समान" कोड, जिससे अंदाजा लगाया जा सके कि किस तरह की कोडिंग शैली स्पष्ट है।

प्राकृतिक तुलना:

// C++ comparison for built-ins and user-defined types
bool    isEqual          = A == B ;
bool    isNotEqual       = A != B ;
bool    isLesser         = A <  B ;
bool    isLesserOrEqual  = A <= B ;

// Java comparison for user-defined types
boolean isEqual          = A.equals(B) ;
boolean isNotEqual       = ! A.equals(B) ;
boolean isLesser         = A.comparesTo(B) < 0 ;
boolean isLesserOrEqual  = A.comparesTo(B) <= 0 ;

कृपया ध्यान दें कि A और B C ++ में किसी भी प्रकार के हो सकते हैं, जब तक कि ऑपरेटर ओवरलोड प्रदान नहीं किए जाते हैं। जावा में, जब ए और बी आदिम नहीं होते हैं, तो कोड बहुत भ्रामक हो सकता है, यहां तक ​​कि आदिम-जैसी वस्तुओं (बिगइन्टेगर, आदि) के लिए भी ...

प्राकृतिक सरणी / कंटेनर एक्सेसर्स और सबस्क्रिप्टिंग:

// C++ container accessors, more natural
value        = myArray[25] ;         // subscript operator
value        = myVector[25] ;        // subscript operator
value        = myString[25] ;        // subscript operator
value        = myMap["25"] ;         // subscript operator
myArray[25]  = value ;               // subscript operator
myVector[25] = value ;               // subscript operator
myString[25] = value ;               // subscript operator
myMap["25"]  = value ;               // subscript operator

// Java container accessors, each one has its special notation
value        = myArray[25] ;         // subscript operator
value        = myVector.get(25) ;    // method get
value        = myString.charAt(25) ; // method charAt
value        = myMap.get("25") ;     // method get
myArray[25]  = value ;               // subscript operator
myVector.set(25, value) ;            // method set
myMap.put("25", value) ;             // method put

जावा में, हम देखते हैं कि प्रत्येक कंटेनर को एक ही काम करने के लिए (एक सूचकांक या पहचानकर्ता के माध्यम से अपनी सामग्री तक पहुंच), हमारे पास इसे करने का एक अलग तरीका है, जो भ्रामक है।

सी ++ में, प्रत्येक कंटेनर अपनी सामग्री तक पहुंचने के लिए उसी तरह का उपयोग करता है, ऑपरेटर ओवरलोडिंग के लिए धन्यवाद।

प्राकृतिक उन्नत प्रकार हेरफेर

Matrix" जावा मैट्रिक्स ऑब्जेक्ट " और " C ++ मैट्रिक्स ऑब्जेक्ट " के लिए Google पर पाए गए पहले लिंक का उपयोग करते हुए नीचे दिए गए उदाहरण एक वस्तु का उपयोग करते हैं :

// C++ YMatrix matrix implementation on CodeProject
// http://www.codeproject.com/KB/architecture/ymatrix.aspx
// A, B, C, D, E, F are Matrix objects;
E =  A * (B / 2) ;
E += (A - B) * (C + D) ;
F =  E ;                  // deep copy of the matrix

// Java JAMA matrix implementation (seriously...)
// http://math.nist.gov/javanumerics/jama/doc/
// A, B, C, D, E, F are Matrix objects;
E = A.times(B.times(0.5)) ;
E.plusEquals(A.minus(B).times(C.plus(D))) ;
F = E.copy() ;            // deep copy of the matrix

और यह मैट्रिसेस तक सीमित नहीं है। BigIntegerऔरBigDecimal जावा के कक्षाएं, एक ही भ्रामक शब्दाडंबर से ग्रस्त हैं जबकि सी में उनके समकक्ष ++ के रूप में कर रहे हैं में निर्मित प्रकार के रूप में स्पष्ट है।

प्राकृतिक पुनरावृत्तियों:

// C++ Random Access iterators
++it ;                  // move to the next item
--it ;                  // move to the previous item
it += 5 ;               // move to the next 5th item (random access)
value = *it ;           // gets the value of the current item
*it = 3.1415 ;          // sets the value 3.1415 to the current item
(*it).foo() ;           // call method foo() of the current item

// Java ListIterator<E> "bi-directional" iterators
value = it.next() ;     // move to the next item & return the value
value = it.previous() ; // move to the previous item & return the value
it.set(3.1415) ;        // sets the value 3.1415 to the current item

प्राकृतिक फंक्शनलर्स:

// C++ Functors
myFunctorObject("Hello World", 42) ;

// Java Functors ???
myFunctorObject.execute("Hello World", 42) ;

पाठ संयोजन:

// C++ stream handling (with the << operator)
                    stringStream   << "Hello " << 25 << " World" ;
                    fileStream     << "Hello " << 25 << " World" ;
                    outputStream   << "Hello " << 25 << " World" ;
                    networkStream  << "Hello " << 25 << " World" ;
anythingThatOverloadsShiftOperator << "Hello " << 25 << " World" ;

// Java concatenation
myStringBuffer.append("Hello ").append(25).append(" World") ;

ठीक है, जावा में आप उपयोग कर सकते हैं MyString = "Hello " + 25 + " World" ; ... लेकिन, एक सेकंड रुको: यह ऑपरेटर ओवरलोडिंग है, है ना? क्या यह धोखा नहीं है ???

:-D

सामान्य कोड?

समान जेनेरिक कोड संशोधित ऑपरेंड्स बिल्ट-इन / प्राइमेटिव्स (जिनका जावा में कोई इंटरफेस नहीं है), स्टैंडर्ड ऑब्जेक्ट्स (जिसमें सही इंटरफ़ेस नहीं हो सकता) और यूज़र-डिफ़ाइंड ऑब्जेक्ट्स दोनों के लिए उपयोग योग्य होना चाहिए।

उदाहरण के लिए, मनमाने प्रकार के दो मूल्यों के औसत मूल्य की गणना:

// C++ primitive/advanced types
template<typename T>
T getAverage(const T & p_lhs, const T & p_rhs)
{
   return (p_lhs + p_rhs) / 2 ;
}

int     intValue     = getAverage(25, 42) ;
double  doubleValue  = getAverage(25.25, 42.42) ;
complex complexValue = getAverage(cA, cB) ; // cA, cB are complex
Matrix  matrixValue  = getAverage(mA, mB) ; // mA, mB are Matrix

// Java primitive/advanced types
// It won't really work in Java, even with generics. Sorry.

ओवरलोडिंग पर चर्चा करते संचालक

अब जब हमने ऑपरेटर ओवरलोडिंग का उपयोग करके C ++ कोड के बीच उचित तुलना देखी है, और जावा में समान कोड है, तो अब हम एक अवधारणा के रूप में "ऑपरेटर ओवरलोडिंग" पर चर्चा कर सकते हैं।

कंप्यूटर से पहले ऑपरेटर ओवरलोडिंग मौजूद है

बाहर भी कंप्यूटर विज्ञान के, वहाँ ऑपरेटर ओवरलोडिंग है: उदाहरण के लिए, गणित में, ऑपरेटरों की तरह +, -, *, आदि अतिभारित रहे हैं।

दरअसल, ऑपरेंड्स के प्रकार (संख्यात्मक, वैक्टर, क्वांटम वेव फ़ंक्शंस, मैट्रिसेस, आदि) के आधार पर +, के -, का *, आदि में परिवर्तन होता है।

हम में से अधिकांश, हमारे विज्ञान पाठ्यक्रमों के हिस्से के रूप में, ऑपरेटरों के लिए कई महत्व सीखते हैं, जो ऑपरेंड के प्रकारों पर निर्भर करते हैं। क्या हमने उन्हें भ्रमित किया, उन्हें?

ऑपरेटर ओवरलोडिंग उसके ऑपरेंड पर निर्भर करता है

यह ऑपरेटर ओवरलोडिंग का सबसे महत्वपूर्ण हिस्सा है: जैसे गणित में, या भौतिकी में, ऑपरेशन इसके ऑपरेंड्स के प्रकारों पर निर्भर करता है।

तो, ऑपरेंड के प्रकार को जानें, और आप ऑपरेशन के प्रभाव को जान पाएंगे।

यहां तक ​​कि सी और जावा में (हार्ड-कोडित) ऑपरेटर ओवरलोडिंग है

सी में, एक ऑपरेटर का वास्तविक व्यवहार उसके ऑपरेंड के अनुसार बदल जाएगा। उदाहरण के लिए, दो पूर्णांक जोड़ना दो युगल, या एक पूर्णांक और एक डबल जोड़ने से अलग है। यहां तक ​​कि संपूर्ण सूचक अंकगणितीय डोमेन भी है (कास्टिंग के बिना, आप एक सूचक को पूर्णांक में जोड़ सकते हैं, लेकिन आप दो संकेत नहीं जोड़ सकते हैं ...)।

जावा में, कोई सूचक अंकगणित नहीं है, लेकिन किसी को फिर भी +ऑपरेटर के बिना स्ट्रिंग संयोजन मिला "ऑपरेटर ओवरलोडिंग बुराई है" पंथ में एक अपवाद का औचित्य साबित करने के लिए पर्याप्त हास्यास्पद होगा।

यह सिर्फ इतना है कि आप एक (ऐतिहासिक कारणों से) या जावा ( व्यक्तिगत कारणों से , नीचे देखें) कोडर के रूप में, आप अपना स्वयं का प्रदान नहीं कर सकते।

सी ++ में, ऑपरेटर ओवरलोडिंग वैकल्पिक नहीं है ...

C ++ में, ऑपरेटर के लिए निर्मित प्रकार संभव नहीं है अधिक भार (और यह एक अच्छी बात है), लेकिन उपयोगकर्ता-निर्धारित प्रकार हो सकता है उपयोगकर्ता परिभाषित ऑपरेटर ओवरलोड हो सकते हैं।

जैसा कि पहले ही कहा गया है, सी ++ में, और जावा के विपरीत, उपयोगकर्ता-प्रकार को भाषा के द्वितीय श्रेणी के नागरिक नहीं माना जाता है, जब अंतर्निहित प्रकारों की तुलना में। इसलिए, यदि बिल्ट-इन प्रकार के ऑपरेटर हैं, तो उपयोगकर्ता प्रकार उन्हें भी सक्षम होना चाहिए।

सच्चाई यह है कि, है की तरह toString(), clone(), equals()तरीकों जावा के लिए कर रहे हैं ( यानी अर्ध मानक की तरह ), सी ++ ऑपरेटर ओवरलोडिंग सी की बहुत बहुत हिस्सा ++ है कि यह उल्लेख जावा तरीकों से पहले मूल सी ऑपरेटर के रूप में प्राकृतिक है, या के रूप में हो जाता है।

टेम्पलेट प्रोग्रामिंग के साथ संयुक्त, ऑपरेटर ओवरलोडिंग एक प्रसिद्ध डिजाइन पैटर्न बन जाता है। वास्तव में, आप अपने स्वयं के वर्ग के लिए अतिभारित ऑपरेटरों और ओवरलोडिंग ऑपरेटरों का उपयोग किए बिना एसटीएल में बहुत दूर नहीं जा सकते।

... लेकिन इसका दुरुपयोग नहीं होना चाहिए

ऑपरेटर ओवरलोडिंग को ऑपरेटर के शब्दार्थ का सम्मान करने का प्रयास करना चाहिए। एक +ऑपरेटर में घटाना न करें (जैसा कि "किसी addफ़ंक्शन में घटाना नहीं है ", या "एक cloneविधि में वापसी बकवास ")।

कास्ट ओवरलोडिंग बहुत खतरनाक हो सकती है क्योंकि वे अस्पष्टता पैदा कर सकते हैं। इसलिए उन्हें वास्तव में अच्छी तरह से परिभाषित मामलों के लिए आरक्षित होना चाहिए। के रूप में, &&और ||जब तक आप वास्तव में आप क्या कर रहे हैं, तब तक उन्हें अधिभार न डालें, जैसा कि आप शॉर्ट सर्किट मूल्यांकन खो देंगे जो देशी ऑपरेटर &&और ||आनंद लेते हैं।

तो ... ठीक है ... फिर यह जावा में क्यों संभव नहीं है?

क्योंकि जेम्स गोसलिंग ने ऐसा कहा:

मैंने ऑपरेटर को काफी व्यक्तिगत पसंद के रूप में ओवरलोडिंग छोड़ दिया क्योंकि मैंने बहुत से लोगों को सी ++ में इसका दुरुपयोग करते देखा था।

जेम्स गोस्लिंग। स्रोत: http://www.gotw.ca/publications/c_family_interview.htm

कृपया नीचे दिए गए स्ट्रॉस्ट्रुप के साथ गोसलिंग के पाठ की तुलना करें:

कई सी ++ डिजाइन के फैसले लोगों को किसी विशेष तरीके से काम करने के लिए मजबूर करने के लिए मेरी नापसंदगी में अपनी जड़ें रखते हैं [...] अक्सर, मुझे व्यक्तिगत रूप से नापसंद एक विशेषता को रेखांकित करने के लिए लुभाया गया था, मैंने ऐसा करने से परहेज किया क्योंकि मुझे नहीं लगता था कि मेरे पास था दूसरों पर अपना विचार रखने का अधिकार

बजरने स्ट्रॉस्ट्रुप। स्रोत: सी ++ का डिजाइन और विकास (1.3 सामान्य पृष्ठभूमि)

क्या ऑपरेटर ओवरलोडिंग से जावा को लाभ होगा?

कुछ वस्तुओं को ऑपरेटर ओवरलोडिंग (कंक्रीट या संख्यात्मक प्रकार, जैसे बिगडीकल, जटिल संख्या, मैट्रिस, कंटेनर, पुनरावृत्त, तुलनित्र, पार्सर आदि) से बहुत लाभ होगा।

C ++ में, आप Stroustrup की विनम्रता के कारण इस लाभ से लाभ उठा सकते हैं। जावा में, आप बस गोस्लिंग की व्यक्तिगत पसंद के कारण खराब हो गए हैं

क्या इसे जावा में जोड़ा जा सकता है?

जावा में अब ऑपरेटर ओवरलोडिंग को न जोड़ने के कारणों में आंतरिक राजनीति का मिश्रण हो सकता है, फीचर के लिए एलर्जी, डेवलपर्स के अविश्वास (आप जानते हैं, सबोटूर जो जावा टीमों को परेशान करते हैं ...), पिछले जेवीएस के साथ संगतता, सही विनिर्देश आदि लिखने का समय।

इसलिए इस सुविधा के लिए अपनी सांस रोक कर न रखें ...

लेकिन वे इसे सी # में करते हैं !!!

हाँ ...

हालांकि यह दोनों भाषाओं के बीच एकमात्र अंतर होने से बहुत दूर है, यह कभी भी मुझे लुभाने में विफल नहीं होता है।

जाहिरा तौर पर, सी # लोग, उनके साथ "हर आदिम एक है struct, और structऑब्जेक्ट से व्युत्पन्न है" , इसे पहले प्रयास में सही मिला।

और वे इसे अन्य भाषाओं में करते हैं !!!

उपयोग किए गए परिभाषित ऑपरेटर ओवरलोडिंग के खिलाफ सभी FUD के बावजूद, निम्न भाषाएं इसका समर्थन करती हैं: स्काला , डार्ट , पायथन , एफ # , सी # , डी # , अल्गोल 68 , स्मॉलटॉक , ग्रूवी , पर्ल 6 , सी ++, रूबी , हास्केल , MATLAB , एफिल , लुआ , क्लोजर , फोरट्रान 90 , स्विफ्ट , एडा , डेल्फी 2005 ...

इतनी सारी भाषाएं, इतने सारे अलग-अलग (और कभी-कभी विरोध) दर्शन के साथ, और फिर भी वे सभी उस बिंदु पर सहमत हैं।

सोच के लिए भोजन...


50
यह एक उत्कृष्ट उत्तर है। मैं इससे असहमत हूं, लेकिन यह अभी भी एक उत्कृष्ट जवाब है। मुझे लगता है कि खराब ओवरलोड से होने वाली समस्याएं अच्छे ओवरलोड के मूल्य से अधिक हैं।
डगलस लीडर

69
@ डगलस लीडर: धन्यवाद! ऑपरेटर ओवरलोडिंग OOP की तरह है। पहली बार जब आप इसे करना सीखते हैं, तो आप हर जगह ओवरलोड लिखते हैं क्योंकि आप हर जगह बेस क्लास और इनहेरिटेंस डालेंगे (जैसे, मीठी विडंबना, जावा एपीआई)। लेकिन यह काफी तेजी से गुजरता है और फिर आप इस संभावना की सराहना करते हैं, जबकि यह गाली नहीं देता है। C ++ के बारे में मेरा अपना 10 साल का अनुभव यह है कि मैंने अपने कोड और कोड को अन्य कोडर्स से देखा है, दोनों में खराब ओवरलोड की संख्या बहुत कम है, मेरा मानना ​​है कि मैं उन्हें एक हाथ से गिन सकता हूं। और यह स्प्रिंट, स्ट्रैकट, मेमसेट और बफर ओवर्रन के साथ समग्र कीड़े की संख्या से बहुत कम है।
पियरसबल

11
@ डगलस लीडर: मेरा मानना ​​है कि एक अन्य SO प्रश्न में उस बारे में चर्चा करने के बाद, कि ऑपरेटर अधिभार के "प्रेमियों" और "हैटर्स" के बीच का अंतर संभवतः कोड के उनके दृष्टिकोण में अंतर के कारण होता है: "Haters" अधिक कार्य करता है क्या मायने रखते हैं ", जिसका अर्थ है कि वे एक कार्य करने के लिए एक फ़ंक्शन की उम्मीद करते हैं, और केवल एक चीज। इस प्रकार ऑपरेटरों को भाषा द्वारा डिजाइन के अनुसार काम करना चाहिए। "प्रेमी" अधिक हैं "वस्तुओं को व्यवहार करना चाहिए", जिसका अर्थ है कि वे अधिक तत्परता से स्वीकार करते हैं कि फ़ंक्शन (और इस प्रकार, ऑपरेटर) अपने मापदंडों के प्रकार के अनुसार अपने व्यवहार को बदल सकते हैं।
पियरसबल २

103
महाकाव्य का जवाब। सबसे योग्य डिबक्स में से एक जो मैंने कभी पढ़ा है।
सेबेस्टियन मच

7
@MaartenBodewes: सभी उदाहरण जो मैंने ऊपर लिखे हैं, और यह सब आपको परेशान करता है "एक डेवलपर के रूप में, आप खराब हैं क्योंकि गोस्लिंग की व्यक्तिगत पसंद" ? कृपया, अपना स्वयं का उत्तर लिखें, "आप डेवलपर्स बेवकूफ हैं, इसका बचाव करते हुए प्रतिभाशाली लोगों को आपके लिए तय करने दें कि आपको क्या चाहिए" कोण। यह चर्चा बिना किसी उद्देश्य के कार्य करती है।
पीरसेबल

44

जेम्स गोस्लिंग ने निम्नलिखित के लिए जावा डिजाइनिंग की तुलना की:

"वहाँ चलने के बारे में यह सिद्धांत है, जब आप एक अपार्टमेंट से दूसरे अपार्टमेंट में जाते हैं। एक दिलचस्प प्रयोग यह है कि आप अपने अपार्टमेंट को पैक करें और सब कुछ बक्से में डाल दें, फिर अगले अपार्टमेंट में जाएँ और जब तक आपको ज़रूरत न हो, तब तक कुछ भी अनपैक न करें। ' अपना पहला भोजन बनाना, और आप एक बॉक्स से कुछ निकाल रहे हैं। फिर एक महीने के बाद या आपने इसका उपयोग किया है कि आपके जीवन में किन चीजों की आपको वास्तव में ज़रूरत है, और फिर आप बाकी चीजों को लेते हैं सामान - यह भूल जाओ कि आप इसे कितना पसंद करते हैं या यह कितना ठंडा है - और आप इसे फेंक देते हैं। यह आश्चर्यजनक है कि यह आपके जीवन को कैसे सरल बनाता है, और आप सभी प्रकार के डिजाइन मुद्दों में उस सिद्धांत का उपयोग कर सकते हैं: सिर्फ इसलिए कि वे चीजें नहीं करते हैं वे शांत हैं या सिर्फ इसलिए कि वे दिलचस्प हैं। "

आप उद्धरण के संदर्भ को यहां पढ़ सकते हैं

मूल रूप से ऑपरेटर ओवरलोडिंग एक वर्ग के लिए बहुत अच्छा है जो किसी प्रकार के बिंदु, मुद्रा या जटिल संख्या को मॉडल करता है। लेकिन इसके बाद आप तेजी से उदाहरणों से बाहर निकलने लगते हैं।

एक और कारक C ++ में डेवलपर्स और ओवरलोडिंग ऑपरेटरों जैसे '&&', '||', कास्ट ऑपरेटर्स और निश्चित रूप से 'नया' में फीचर का दुरुपयोग था। मूल्य और अपवादों के साथ संयोजन के परिणामस्वरूप होने वाली जटिलता को असाधारण सी ++ पुस्तक में अच्छी तरह से कवर किया गया है


6
क्या आप "पास-दर-मूल्य और अपवादों के साथ संयुक्त ऑपरेटर ओवरलोडिंग की जटिलता" का एक कोड उदाहरण प्रदान कर सकते हैं? कुछ वर्षों तक भाषा के साथ खेलने के बावजूद, और C ++ पर सभी प्रभावी / असाधारण पुस्तकों को पढ़ने और उनका मालिक होने के बावजूद, मैं यह समझने में असफल रहा कि आपका क्या मतलब है।
पीरसेबल

60
जेम्स गोस्लिंग के लिए जो काम करता है वह सभी के लिए काम नहीं करेगा। वह अविश्वसनीय रूप से अपने "दिलचस्प" पैकिंग प्रयोग को एक्सट्राप्रोटेट करने के लिए छोटा है, जिसका अर्थ है "दुनिया में वह सब कुछ फेंक दें जिसकी मुझे आवश्यकता नहीं है, इसलिए कोई भी उस सामान का उपयोग नहीं कर सकता है।" वह स्पष्ट रूप से नहीं जानता कि मुझे क्या चाहिए या उपयोग करना चाहिए।
बीटी

49
@BT: इस मुद्दे पर स्ट्रॉस्ट्रुप के दृष्टिकोण की तुलना में सबसे ज्ञानवर्धक, गोसलिंग का दृष्टिकोण है Many C++ design decisions have their roots in my dislike for forcing people to do things in some particular way [...] Often, I was tempted to outlaw a feature I personally disliked, I refrained from doing so because I did not think I had the right to force my views on others. (B. Stroustrup):।
पीरसेबल

29
@ शेव बंदर: "सी ++, व्यापक रूप से बनाम दूसरे, जावा, व्यापक रूप से पसंद किया गया" यह विपणन प्रचार है। याद रखें कि C ++ अकेले बढ़ता है, जबकि जावा (और .NET) मार्केटिंग बुलडोजर से मुनाफा कमाता है। क्या यह अजीब नहीं लगता कि "व्यापक रूप से पसंद की जाने वाली भाषा" के लिए, जावा सर्वर अनुप्रयोगों तक सीमित है, जबकि "व्यापक रूप से संशोधित" (शायद जावा डेवलपर्स और प्रबंधकों द्वारा कोड उत्पादन की लागत को कम करना चाहते हैं) सी ++ बहुत-उच्च से जाता है- उच्च प्रदर्शन के खेल के लिए प्रदर्शन सर्वर? [...]
पियरसबल

16
@ हसन: प्रत्येक भाषा के हैक, जावा के जेनेरिक उस के एक महान उदाहरण हैं। अब, के बारे में I'd like them to go have a look at some C++ code out there that is hideously put together with weird hacks and "exceptional" features of the language: खराब प्रोग्रामर खराब कोड लिखेंगे चाहे भाषा कोई भी हो। बस जावा में फ़ंक्शन मापदंडों के लिए "पास-बाय-संदर्भ" का अनुकरण करने का प्रयास करें ताकि एक विचार हो। मैंने कोड देखा है, और इतनी मेहनत से हँसा कि चोट लग गई। इस तरह की चीजों का उपयोग किया जाता है, इस प्रकार, गोस्लिंग ने जावा में उपयोग करने के लिए भयानक हैक की आवश्यकता नहीं की, फिर भी, मूल रूप से, शून्य लागत पर, सी # और सी ++ दोनों में मौजूद है।
पियरसबल

22

Boost.Units: लिंक टेक्स्ट देखें

यह ऑपरेटर ओवरलोडिंग के माध्यम से शून्य-ओवरहेड आयामी विश्लेषण प्रदान करता है। यह कितना स्पष्ट हो सकता है?

quantity<force>     F = 2.0*newton;
quantity<length>    dx = 2.0*meter;
quantity<energy>    E = F * dx;
std::cout << "Energy = " << E << endl;

वास्तव में "एनर्जी = 4 जे" का उत्पादन करेगा जो सही है।


1
"कैसे ठीक है अगर रखरखाव को जटिल करता है और पृथ्वी पर यह कोड कहां से आता है?"
मूइंग डक

13

जावा डिजाइनरों ने तय किया कि ऑपरेटर ओवरलोडिंग के लायक होने की तुलना में अधिक परेशानी थी। इतना ही आसान।

ऐसी भाषा में जहां प्रत्येक वस्तु चर वास्तव में एक संदर्भ है, ऑपरेटर ओवरलोडिंग को कम से कम C ++ प्रोग्रामर के लिए - काफी अतार्किक होने का अतिरिक्त खतरा मिलता है। स्थिति की तुलना C # के == ऑपरेटर ओवरलोडिंग Object.Equalsऔर Object.ReferenceEquals(या इसे जो भी कहा जाता है) के साथ करें।


8

ग्रूवी का ऑपरेटर ओवरलोडिंग है, और जेवीएम में चलता है। यदि आपको प्रदर्शन में बाधा नहीं आती है (जो प्रतिदिन छोटा होता है)। यह स्वचालित रूप से विधि नामों पर आधारित है। उदाहरण के लिए, '+' 'प्लस (तर्क)' विधि को कॉल करता है।


4
मैं चाहता हूं कि ऑपरेटर ओवरलोडिंग के साथ सभी वाक्य-भारी भाषाओं ने उस तकनीक का उपयोग किया होगा। मैंने कभी नहीं समझा कि उन्हें विधि नामकरण और लुकअप का एक विशेष संस्करण क्यों आविष्कार करना है। Stroustrup D & EC ++ में किसी विकल्प का उल्लेख नहीं करता है। सी # टीम ने लिनक सिंटैक्स ( where ...बन जाता है .Where(i => ... ) के साथ सही दृष्टिकोण लिया । यदि केवल वे अंकगणितीय संचालकों के साथ ऐसा ही करते, तो बहुत सी चीजें सरल और अधिक शक्तिशाली होतीं। जावा में एक साफ स्लेट का लाभ है और यह अधिकार प्राप्त कर सकता है (हालांकि धार्मिक कारणों से, यह शायद कभी नहीं होगा)।
डैनियल ईयरविकेर

@DanielEarwicker, मैंने अक्सर ध्यान दिया है कि जब जटिल असहमति होती है कि लोग प्रकृति में "धार्मिक" होने के रूप में दोनों तरफ की प्रेरणाओं को टैग करेंगे।

@ नहीं, मैं इस तरह से ओवरलोडिंग के एक सीमित उप-समूह के साथ रह सकता था, बशर्ते कि विधि के नामों का एक विशेष टैग था जो उन्हें दृष्टिगत रूप से अलग रखता हो। एक "+" ओएल के कार्यान्वयन के लिए एक __plus () विधि को परिभाषित करने और कुछ हद तक अतिदेय चीजों को रखने और यहां तक ​​कि सरणी सदस्यता जैसी कुछ चीजें। मैं जिस तरह से जीने के लिए तैयार नहीं हूं वह सी + + और सी # इसे लागू करने के लिए फिट देखा गया है।

2
उत्तर नहीं। VM पर कई भाषाएं चल रही हैं। भाषाओं को स्विच करने के लिए ऑपरेटर ओवरलोडिंग अपने आप में एक अच्छा कारण नहीं होना चाहिए।
Maarten Bodewes

6

मुझे लगता है कि यह डेवलपर्स को उन कार्यों को बनाने के लिए मजबूर करने के लिए एक जागरूक डिजाइन विकल्प हो सकता है जिनके नाम स्पष्ट रूप से उनके इरादों को संवाद करते हैं। सी ++ में डेवलपर्स उन कार्यक्षमता के साथ ऑपरेटरों को अधिभारित करेंगे जो अक्सर दिए गए ऑपरेटर की आमतौर पर स्वीकृत प्रकृति से कोई संबंध नहीं रखते हैं, जिससे यह निर्धारित करना लगभग असंभव हो जाता है कि ऑपरेटर की परिभाषा को देखे बिना कोड का एक टुकड़ा क्या करता है।


14
In C++ developers would overload operators with functionality that would often have no relation to the commonly accepted nature of the given operator: यह एक कृतसंकल्प मुखरता है। मैं 12 साल से एक पेशेवर सी ++ डेवलपर हूं, और मुझे शायद ही कभी इस मुद्दे का सामना करना पड़ा। वास्तव में, C ++ में मैंने जो सबसे बग और डिज़ाइन की त्रुटियां देखीं, वे C- स्टाइल कोड ( void *,, कास्ट आदि) में
थीं

6
-1। आपके द्वारा असाइन किया गया प्रत्येक चर एक प्रतीक है, जैसे अंकगणितीय ऑपरेटर प्रतीक। चाहे आप उस चर को नाम देने के लिए एक वाक्यांश का उपयोग करें, एक शब्द, या एक अक्षर, आपका (या आपकी टीम का) निर्णय है। कौन कहे कि सार्थक क्या है और क्या नहीं है? जवाब है आप, प्रोग्रामर। शुद्ध गणित में, गणित के बीच गुणा का मतलब बुनियादी अंकगणित में दो संख्याओं के बीच गुणा करने के लिए कुछ अलग है। फिर भी हम दोनों प्रकार के गुणन के लिए समान प्रतीकों का उपयोग करते हैं।
इंजीनियर

2
@ अंपायरबल: दावा दुर्भाग्य से सही है। आपको इसे कार्रवाई में देखने के लिए IOstreams से अधिक दूर नहीं देखना होगा। शुक्र है कि अधिकांश डेवलपर्स मौजूदा ऑपरेटरों के लिए नए शब्दार्थ का आविष्कार करने के बारे में अधिक चौकस हैं।
बेन वोइगट

5
@BenVoigt: [...] और मैं इस तथ्य का भी उल्लेख नहीं कर रहा हूं कि addफ़ंक्शन वास्तव में वास्तव में दुरुपयोग किया जा सकता है (जैसे गुणा करना, या म्यूटेक्स प्राप्त करना) ... उपयोगकर्ता14128 द्वारा उल्लिखित दुरुपयोग ऑपरेटरों तक सीमित नहीं है, लेकिन ऑपरेटर ओवरलोडिंग के बारे में कुछ तरह का पैथोलॉजिकल डर है जो मुझे लगता है कि सी बनाम सी ++ के पहले के दिनों से आता है, एक डर जो जावा में अनमॉडिफाइड सही गया, लेकिन शुक्र है, सी # में नहीं गया ... अंत में, शब्दार्थ का सम्मान करना और स्पष्ट कार्य / ऑपरेटर लिखना डेवलपर का काम है। भाषा की नहीं।
पियरसेबल

3
@ jbo5112: उदाहरण: cout << f() || g(); कोष्ठक इसे स्पष्ट नहीं करते हैं, वे इसे सही बनाते हैं। और यह बिट शिफ्ट ऑपरेटरों का दुरुपयोग नहीं किया जा रहा था, वे आवश्यक नहीं होंगे। से cout << (5&3) << endl;बेहतर क्यों है cout.fmt(5&3)(endl);? एक फनकार सदस्य चर पर फ़ंक्शन कॉल ऑपरेटर का उपयोग करना बिट्स ऑपरेटरों को पुनर्जीवित करने की तुलना में धाराओं के लिए एक बेहतर बेहतर डिजाइन होगा, क्योंकि ग्लिफ़ अच्छा लगता है। लेकिन यह केवल धाराओं के साथ गलत बात से दूर है।
बेन वोइगट

5

ठीक है आप वास्तव में ऑपरेटर ओवरलोडिंग के साथ खुद को पैर में गोली मार सकते हैं। यह उन बिंदुओं के साथ है जैसे लोग उनके साथ बेवकूफियां करते हैं और इसलिए कैंची को दूर ले जाने का निर्णय लिया गया।

कम से कम मुझे लगता है कि यही कारण है। मैं तुम्हारी तरफ वैसे भी हूँ। :)



2
यह सोचने का बहुत बुरा तरीका है। आप अपने आप को पैर में गोली मार सकते हैं, हम आपके हाथों को काट सकते हैं, इसलिए आप नहीं कर पाएंगे। और निश्चित रूप से हम मानते हैं कि आप एक बेवकूफ हैं जो खुद को गोली मार लेंगे।
ntj

5

कुछ लोगों का कहना है कि जावा में ओवरलोडिंग करने वाले ऑपरेटर को अश्लीलता का सामना करना पड़ेगा। क्या उन लोगों ने कभी कुछ जावा कोड को देखना बंद कर दिया है, जो कुछ बुनियादी गणित कर रहे हैं जैसे बिगडेसीमल का उपयोग करके एक वित्तीय मूल्य को प्रतिशत में बढ़ाना? .... इस तरह की कवायद की वाचालता स्वयं के प्रदर्शन का प्रदर्शन बन जाती है। विडंबना यह है कि जावा में ओवरलोडिंग करने वाले ऑपरेटर को जोड़ने से हमें अपनी मुद्रा वर्ग बनाने की अनुमति मिलेगी जो इस तरह के गणितीय कोड को सुरुचिपूर्ण और सरल बना देगा (कम अस्पष्ट)।


4

यह कहना कि ऑपरेटर ओवरलोडिंग उस प्रकार की तार्किक त्रुटियों की ओर जाता है जो ऑपरेटर ऑपरेशन तर्क से मेल नहीं खाता है, यह कुछ भी नहीं कहने जैसा है। एक ही प्रकार की त्रुटि तब होगी जब फ़ंक्शन का नाम ऑपरेशन लॉजिक के लिए अनुपयुक्त है - तो इसका समाधान क्या है: फ़ंक्शन उपयोग की क्षमता को गिरा दें?! यह एक हास्यपूर्ण उत्तर है - "ऑपरेशन लॉजिक के लिए अनुचित", हर पैरामीटर का नाम, हर वर्ग, फ़ंक्शन या जो भी तर्क से अनुचित हो सकता है। मुझे लगता है कि यह विकल्प सम्मानजनक प्रोग्रामिंग भाषा में उपलब्ध होना चाहिए, और जो सोचते हैं कि यह असुरक्षित है - अरे नहीं दोनों कहते हैं कि आपको इसका उपयोग करना होगा। चलो सी # ले लो। उन्होंने संकेत दिया लेकिन अरे - 'असुरक्षित कोड' कथन है - कार्यक्रम जैसा कि आप अपने जोखिम पर पसंद करते हैं।


4

तकनीकी रूप से, प्रत्येक प्रोग्रामिंग भाषा में ऑपरेटर ओवरलोडिंग होता है जो विभिन्न प्रकार की संख्याओं, जैसे पूर्णांक और वास्तविक संख्याओं से निपट सकता है। स्पष्टीकरण: ओवरलोडिंग शब्द का अर्थ है कि एक फ़ंक्शन के लिए बस कई कार्यान्वयन हैं। अधिकांश प्रोग्रामिंग भाषाओं में ऑपरेटर + के लिए अलग-अलग कार्यान्वयन प्रदान किए जाते हैं, एक पूर्णांक के लिए, एक वास्तविक के लिए, इसे ऑपरेटर ओवरलोडिंग कहा जाता है।

अब, कई लोगों को यह अजीब लगता है कि जावा में ऑपरेटर + के लिए एक साथ तार जोड़ने के लिए ऑपरेटर ओवरलोडिंग है, और एक गणितीय दृष्टिकोण से यह वास्तव में अजीब होगा, लेकिन एक प्रोग्रामिंग भाषा के डेवलपर के दृष्टिकोण से देखा जाए, तो बिलिन ओवरलोडिंग को जोड़ने के साथ कुछ भी गलत नहीं है। अन्य वर्गों जैसे स्ट्रिंग के लिए ऑपरेटर + के लिए। हालाँकि, ज्यादातर लोग इस बात से सहमत हैं कि एक बार जब आप स्ट्रिंग के लिए बिल्ट ओवरलोडिंग + जोड़ लेते हैं, तो आमतौर पर डेवलपर के लिए यह कार्यक्षमता प्रदान करना एक अच्छा विचार है।

एक पूरी तरह से उस असहमति से असहमत हैं जो ऑपरेटर ओवरफोकिंग कोड को लोड करता है, क्योंकि यह डेवलपर को तय करने के लिए छोड़ दिया जाता है। यह सोचने के लिए भोला है, और काफी ईमानदार होने के लिए, यह पुराना हो रहा है।

जावा 8 में ऑपरेटर ओवरलोडिंग को जोड़ने के लिए +1।


+कुछ भी स्ट्रिंग-ईश को संक्षिप्त करने के लिए जावा का उपयोग आईएमएचओ बहुत ही घृणित है, जैसा कि /पूरे और आंशिक विभाजन के लिए सी और फोरट्रान में ओवरलोडिंग है । पास्कल के कई संस्करणों में, किसी भी संख्यात्मक प्रकार पर अंकगणितीय संचालकों के उपयोग से संचालकों को कास्टिंग करने के बराबर संख्यात्मक परिणाम प्राप्त होंगे Real, हालांकि जो परिणाम पूर्ण संख्या में नहीं हो सकते हैं उन्हें पूर्णांक के माध्यम से Truncया उससे Roundपहले खिलाया जाना चाहिए ।
सुपरकाट

2

जावा को कार्यान्वयन की भाषा के रूप में मान लें तो a, b, और c सभी को जटिल मानों के रूप में संदर्भित किया जाएगा जिसमें प्रारंभिक मान शून्य हैं। यह मानते हुए कि कॉम्प्लेक्स बिगइन्टेगर और इसी तरह के अपरिवर्तनीय बिगडेसिमल के रूप में अपरिवर्तनीय है , मुझे लगता है कि आपको निम्नलिखित का मतलब है, क्योंकि आप बी और सी को जोड़ने से लौटे कॉम्प्लेक्स का संदर्भ दे रहे हैं, और इस संदर्भ की तुलना नहीं करते हैं।

नहीं है:

Complex a, b, c; a = b + c;

की तुलना में बहुत सरल:

Complex a, b, c; a = b.add(c);

2
क्या मैं? ;) बराबरी का अर्थ असाइनमेंट या तुलना दोनों हो सकता है, लेकिन = हमेशा असाइनमेंट है और == हमेशा तुलना है। नाम स्वयं त्रुटियों के बड़े स्रोतों का परिचय दे सकते हैं।

1

कभी-कभी ऑपरेटर ओवरलोडिंग, मित्र कक्षाएं और कई विरासत होना अच्छा होगा।

हालाँकि मुझे अभी भी लगता है कि यह एक अच्छा निर्णय था। यदि जावा में ऑपरेटर ओवरलोडिंग होता तो हम स्रोत कोड को देखे बिना ऑपरेटर अर्थों के बारे में निश्चित नहीं हो सकते। वर्तमान में यह आवश्यक नहीं है। और मुझे लगता है कि ऑपरेटर ओवरलोडिंग के बजाय तरीकों का उपयोग करने का आपका उदाहरण भी काफी पठनीय है। यदि आप चीजों को और अधिक स्पष्ट करना चाहते हैं तो आप हमेशा बालों वाले बयानों के ऊपर एक टिप्पणी जोड़ सकते हैं।

// a = b + c
Complex a, b, c; a = b.add(c);

12
बेशक, जैसा कि कहीं और उल्लेख किया गया है, आप कभी भी ऐड फ़ंक्शन के अर्थ के बारे में सुनिश्चित नहीं हो सकते हैं।
ग्रहण

सच है, मुझे अभी भी यह जानकर सुकून मिलता है कि कम से कम मेरे ऑपरेटर हार्ड कोडेड हैं। बेशक, सुविधाओं का होना और उन्हें समझदारी से इस्तेमाल करना ही हमें अच्छा करेगा। समस्या यह है कि यह जानना मुश्किल है कि क्या किसी ने उन्हें समझदारी से इस्तेमाल किया है। और यह कि आप समझदारी की परिभाषा पर सहमत हैं। :-)

1
कोड को स्पष्ट करने के लिए जो टिप्पणी जोड़ी गई है, वह वह कोड है जो उस भाषा में दिखेगा जो ऑपरेटर को ओवरलोडिंग का समर्थन करता है। इसके अलावा, तथ्य यह है कि ऑपरेटर के संदर्भ में टिप्पणी लिखी जाती है, ऑपरेटर के ओवरलोडिंग के आपके विरोध को मानता है।
एलुआन हद्दाद

0

यह इसे खारिज करने का एक अच्छा कारण नहीं है, लेकिन एक व्यावहारिक है:

लोग हमेशा जिम्मेदारी से इसका उपयोग नहीं करते हैं। पायथन लाइब्रेरी स्केपी से इस उदाहरण को देखें:

>>> IP()
<IP |>
>>> IP()/TCP()
<IP frag=0 proto=TCP |<TCP |>>
>>> Ether()/IP()/TCP()
<Ether type=0x800 |<IP frag=0 proto=TCP |<TCP |>>>
>>> IP()/TCP()/"GET / HTTP/1.0\r\n\r\n"
<IP frag=0 proto=TCP |<TCP |<Raw load='GET / HTTP/1.0\r\n\r\n' |>>>
>>> Ether()/IP()/IP()/UDP()
<Ether type=0x800 |<IP frag=0 proto=IP |<IP frag=0 proto=UDP |<UDP |>>>>
>>> IP(proto=55)/TCP()
<IP frag=0 proto=55 |<TCP |>>

यहाँ स्पष्टीकरण है:

/ ऑपरेटर का उपयोग दो परतों के बीच एक रचना ऑपरेटर के रूप में किया गया है। ऐसा करते समय, निचली परत ऊपरी परतों के अनुसार अपने एक या अधिक डिफॉल्ट क्षेत्रों को ओवरलोड कर सकती है। (आप अभी भी वह मूल्य दे सकते हैं जो आप चाहते हैं)। एक स्ट्रिंग को एक कच्ची परत के रूप में इस्तेमाल किया जा सकता है।


0

जावा ऑपरेटर ओवरलोडिंग के मूल समर्थन के लिए विकल्प

चूंकि जावा में ऑपरेटर ओवरलोडिंग नहीं है, इसलिए यहां कुछ विकल्प दिए गए हैं:

  1. दूसरी भाषा का प्रयोग करें। ग्रूवी और स्काला दोनों में ऑपरेटर ओवरलोडिंग है, और जावा पर आधारित हैं।
  2. जावा-ओओ का उपयोग करें , एक प्लगइन जो ऑपरेटर को जावा में ओवरलोडिंग सक्षम करता है। ध्यान दें कि यह स्वतंत्र नहीं है। इसके अलावा, इसके कई मुद्दे हैं, और जावा (यानी जावा 10) की नवीनतम रिलीज़ के साथ संगत नहीं है। ( मूल StackOverflow स्रोत )
  3. जेएनआई , जावा नेटिव इंटरफेस या विकल्प का उपयोग करें । यह आपको जावा में उपयोग के लिए C या C ++ (शायद अन्य?) विधियों को लिखने की अनुमति देता है। बेशक यह भी स्वतंत्र मंच नहीं है।

यदि किसी को दूसरों के बारे में पता है, तो कृपया टिप्पणी करें, और मैं इसे इस सूची में जोड़ दूंगा।


0

जबकि जावा भाषा सीधे ऑपरेटर ओवरलोडिंग का समर्थन नहीं करती है, आप इसे सक्षम करने के लिए किसी भी जावा प्रोजेक्ट में कई गुना कंपाइलर प्लगइन का उपयोग कर सकते हैं । यह जावा 8 - 13 (वर्तमान जावा संस्करण) का समर्थन करता है और IntelliJ IDEA में पूरी तरह से समर्थित है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.