उपयुक्त ऑपरेटर ओवरलोडिंग के स्पष्ट उदाहरण किसी भी वर्ग हैं जो उसी तरह से व्यवहार करते हैं जैसे संख्याएं संचालित होती हैं। तो BigInt वर्गों (के रूप में Jalayn पता चलता है), जटिल संख्याओं या मैट्रिक्स वर्गों (के रूप में Superbest पता चलता है) सब, एक ही कार्य है कि साधारण संख्या तो गणितीय ऑपरेटर पर वास्तव में अच्छी तरह से मैप किया है, जबकि समय परिचालन (के रूप में द्वारा सुझाए गए svick ) अच्छी तरह से एक सबसेट पर नक्शा उन कार्यों के।
थोड़ा और अधिक संक्षेप में, ऑपरेटरों जब प्रदर्शन के लिए इस्तेमाल किया जा सकता है की तरह सेट संचालन, तो operator+
एक हो सकता है संघ , operator-
हो सकता है एक पूरक , आदि यह प्रतिमान हालांकि फैलाने के लिए शुरू होता है खासकर यदि आप इसके अलावा या एक ऑपरेशन जो 'isn के लिए गुणा ऑपरेटर का उपयोग टी कम्यूटेटिव , जैसा कि आप उनसे उम्मीद कर सकते हैं।
C # अपने आप में नॉन-न्यूमेरिक ऑपरेटर ओवरलोडिंग का एक उत्कृष्ट उदाहरण है । इसका उपयोग +=
और प्रतिनिधियों-=
को जोड़ने और घटाना है , अर्थात उन्हें रजिस्टर और डी-रजिस्टर करना। यह अच्छी तरह से काम करता है क्योंकि और ऑपरेटर काम करते हैं जैसा कि आप उनसे उम्मीद करेंगे, और इसका परिणाम बहुत अधिक संक्षिप्त कोड में होगा।+=
-=
प्यूरिस्ट के लिए, स्ट्रिंग +
ऑपरेटर के साथ समस्याओं में से एक यह है कि यह कम्यूटेटिव नहीं है। "a"+"b"
जैसा है वैसा नहीं है "b"+"a"
। हम स्ट्रिंग्स के लिए इस अपवाद को समझते हैं क्योंकि यह बहुत आम है, लेकिन हम यह कैसे बता सकते हैं कि operator+
अन्य प्रकारों का उपयोग कम्यूटेटिव होगा या नहीं? अधिकांश लोग यह मान लेंगे कि यह तब तक है, जब तक कि वस्तु स्ट्रिंग-जैसी नहीं है , लेकिन आप वास्तव में कभी नहीं जानते कि लोग क्या मानेंगे।
स्ट्रिंग्स के साथ, मैट्रिस के फॉयबल्स बहुत अच्छी तरह से जाने जाते हैं। यह स्पष्ट है कि Matrix operator* (double, Matrix)
एक अदिश गुणन है, जबकि उदाहरण के लिए Matrix operator* (Matrix, Matrix)
एक मैट्रिक्स गुणा (यानी डॉट-उत्पाद गुणन का एक मैट्रिक्स) होगा।
इसी तरह प्रतिनिधियों के साथ ऑपरेटरों का उपयोग स्पष्ट रूप से गणित से बहुत दूर है कि आप उन गलतियों को करने की संभावना नहीं है।
संयोग से, 2011 के एसीसीयू सम्मेलन में , रोजर ऑर एंड स्टीव लव ने कुछ वस्तुओं पर एक सत्र प्रस्तुत किया, जो दूसरों की तुलना में अधिक समान हैं - समानता, मूल्य और पहचान के कई अर्थों पर एक नज़र । फ्लोटिंग पॉइंट समानता के बारे में रिचर्ड हैरिस के परिशिष्ट के रूप में उनकी स्लाइड डाउनलोड करने योग्य हैं । सारांश: बहुत सावधान रहो के साथ , यहाँ ड्रेगन हो!operator==
ऑपरेटर ओवरलोडिंग एक बहुत शक्तिशाली सिमेंटिक तकनीक है, लेकिन इसका अधिक उपयोग करना आसान है। आदर्श रूप से आपको इसका उपयोग केवल स्थितियों में ही करना चाहिए जब यह संदर्भ से बहुत स्पष्ट हो कि ओवरलोड ऑपरेटर का प्रभाव क्या है। कई मायनों a.union(b)
में स्पष्ट है a+b
, और की तुलना a*b
में बहुत अधिक अस्पष्ट है a.cartesianProduct(b)
, खासकर जब से एक कार्टेशियन उत्पाद का परिणाम एक के SetLike<Tuple<T,T>>
बजाय होगा SetLike<T>
।
ऑपरेटर ओवरलोडिंग के साथ वास्तविक समस्याएं तब आती हैं जब एक प्रोग्रामर मानता है कि एक वर्ग एक तरह से व्यवहार करेगा, लेकिन यह वास्तव में दूसरे में व्यवहार करता है। सिमेंटिक क्लैश इस प्रकार है जो मैं सुझा रहा हूं कि इससे बचने की कोशिश करना महत्वपूर्ण है।