मैं, जावा में अतिभारित ऑपरेटरों होने विशेष रूप से निम्न स्थितियों में याद आती है:
एक वर्ग है कि एक एल्गोरिदम या एक मज़ेदार: (रणनीति पैटर्न, जिम्मेदारी की श्रृंखला, इंटरप्रेटर, आदि)। प्राकृतिक चीज ओप() को अधिभारित करना है; इसके बजाए, प्रत्येक प्रोग्रामर कार्यों के लिए नाम (अक्सर असंगत और इस प्रकार भ्रमित) के साथ आता है: "eval", "मूल्यांकन", "ऑपरेशन", "doIt" इत्यादि। इसलिए स्पष्टता कम हो जाती है, क्योंकि इन नामों को हम उपयोग करने के लिए मजबूर हैं उनके अर्थ को स्पष्ट मत बनाओ।
एक वर्ग जिस पर दूसरे प्रकार का रूपांतरण है: सी ++ में ऑपरेटर टाइप() है, और वास्तविक रूपांतरण के लिए और वांछित वर्ग के आंतरिक सदस्य को प्राप्त करने के लिए दोनों काम करता है। दूसरे मामले जावा में एक बहुत ऊपर आता है जब एक वर्ग को अनावश्यक रूप से अंतिम है, लेकिन आप इसे करने के लिए आपरेशन जोड़ना चाहते हैं:
class DecoratedStringBuffer { //extends StringBuffer doesn't work, as String is final
private String byContainmentThen;
public decorate(final String prefix, final String suffix) { ... }
public append(final String s) { byContainmentThen.append(s);}
// other forwarding functions
}
DecoratedStringBuffer के बाद से है-एक StringBuffer नहीं है, इससे पहले कि यह करने के लिए अपने कोड और रिटर्न छोड़ देता है क्लाइंट कोड, इसे संभवतः एक फ़ंक्शन द्वारा परिवर्तित किया जाना चाहिए, जो अंततः प्रत्यय और उपसर्ग को लागू करता है।यह बहुत अच्छा होगा अगर हम उस ऑपरेटर स्ट्रिंगबफर() को कॉल कर सकते हैं (और यदि जावा, सी ++ की तरह भी अधिक हो, तो उपयोगकर्ता द्वारा प्रदत्त रूपांतरण लागू हो सकता है)।
इसके बजाय, क्योंकि कोई सम्मेलन नहीं है, हमें इसे एक ऐसा नाम देना होगा जो आवश्यक रूप से अधिक अस्पष्ट है। getStringBuffer() एक स्पष्ट नाम है, लेकिन कई जावा उपयोगकर्ताओं के लिए, जो एक संबंधित सेटस्ट्रिंगबफर को इंगित करेगा, जिसे हम नहीं चाहते हैं। भले ही यह इसका अर्थ न हो, नाम का संदिग्ध: स्ट्रिंगबफर है जिसे आप उस पर प्राप्त कर रहे हैं जिसे हम संचालित करते हैं, या कुछ और?
toStringBuffer() एक बेहतर नाम है, और पैटर्न जो मैं लागू करता हूं, लेकिन फिर कोड को पढ़ने वाले किसी को आश्चर्य होता है कि गेटटर की तरह दिखने के लिए क्लासनाम को "टू" कहा जाता है।
ईमानदारी से, संख्यात्मक कक्षाओं या "स्पष्ट रूप से" कोकेटेनेटेबल ऑब्जेक्ट्स को डिजाइन करने के अलावा, ओप + ओवरलोडिंग के लिए बहुत कम उपयोग है। और चूंकि जावा मूल्य-आधारित नहीं है जैसे सी ++, op = के लिए बहुत अधिक उपयोग नहीं है; जावा सब कुछ एक आदिम int मूल्य वर्ग की तरह कार्य करने की कोशिश नहीं कर रहा है। यह ओप() और रूपांतरण ऑपरेटर मुझे याद आती है।
मैंने आपके प्रश्न को कॉर्निफाइड किया। – Frank