संक्षिप्त उत्तर: संगति
हालांकि, आपके सवाल का ठीक से जवाब देने के लिए, मेरा सुझाव है कि हम एक कदम पीछे ले जाएं और इस मुद्दे पर गौर करें कि प्रोग्रामिंग भाषा में समानता का क्या मतलब है। कम से कम तीन अलग-अलग संभावनाएं हैं, जो विभिन्न भाषाओं में उपयोग की जाती हैं:
- संदर्भ समानता : इसका अर्थ है कि a और b एक ही वस्तु के संदर्भ में है तो a = b सत्य है। यह सही नहीं होगा यदि a और b को अलग-अलग वस्तुओं के लिए संदर्भित किया जाए, भले ही a और b के सभी गुण समान हों।
- उथला समानता : इसका मतलब है कि a = b सत्य है यदि वस्तुओं के सभी गुण जिनके लिए a और b संदर्भ समान हैं। उथले समानता को आसानी से मेमोरी स्पेस की एक बिटवाइज़ तुलना द्वारा लागू किया जा सकता है जो दो वस्तुओं का प्रतिनिधित्व करता है। कृपया ध्यान दें कि संदर्भ समानता उथले समानता का अर्थ है
- गहरी समानता : इसका अर्थ है कि a = b सत्य है यदि a और b में प्रत्येक गुण समान या गहरा समान है। कृपया ध्यान दें कि गहरी समानता संदर्भ समानता और उथले समानता दोनों से निहित है। इस अर्थ में, गहरी समानता समानता का सबसे कमजोर रूप है और संदर्भ समानता सबसे मजबूत है।
इन तीन प्रकार की समानता का उपयोग अक्सर किया जाता है क्योंकि वे लागू करने के लिए सुविधाजनक होते हैं: सभी तीन समानता की जांच आसानी से एक कंपाइलर द्वारा उत्पन्न की जा सकती है (गहरी समानता के मामले में, कंपाइलर को अनन्त छोरों को रोकने के लिए टैग बिट्स का उपयोग करने की आवश्यकता हो सकती है यदि कोई संरचना है तुलना किया जाना परिपत्र संदर्भ है)। लेकिन एक और समस्या है: इनमें से कोई भी उपयुक्त नहीं हो सकता है।
गैर-तुच्छ प्रणालियों में, वस्तुओं की समानता को अक्सर गहरी और संदर्भ समानता के बीच कुछ के रूप में परिभाषित किया जाता है। यह जांचने के लिए कि क्या हम दो वस्तुओं को एक निश्चित संदर्भ में समान मानना चाहते हैं, हमें कुछ विशेषताओं की तुलना करने की आवश्यकता हो सकती है जहां यह स्मृति में और दूसरों को गहरी समानता से खड़ा होता है, जबकि कुछ विशेषताओं को पूरी तरह से कुछ अलग करने की अनुमति दी जा सकती है। हम वास्तव में क्या पसंद करेंगे "एक समानता का अगला प्रकार", वास्तव में अच्छा है, जिसे अक्सर साहित्यिक समानता में कहा जाता है । यदि हमारे डोमेन में वे समान हैं, तो चीजें समान हैं। =)
इसलिए हम आपके प्रश्न पर वापस आ सकते हैं:
क्या इसे चूकने का कुछ बड़ा लाभ यह है कि मैं बस गायब हूँ, या यह उचित प्रतीत नहीं होता है कि डिफ़ॉल्ट व्यवहार तार्किक समानता होना चाहिए, और यदि समानता तार्किक वर्ग के लिए मौजूद नहीं है तो संदर्भ समानता को वापस करना है?
किसी भी भाषा में 'a == b' लिखने पर हमें क्या मतलब है? आदर्श रूप से, यह हमेशा समान होना चाहिए: शब्दार्थ समानता। लेकिन यह संभव नहीं है।
मुख्य विचारों में से एक यह है कि, कम से कम सरल प्रकार की संख्याओं के लिए, हम उम्मीद करते हैं कि समान मूल्य के असाइनमेंट के बाद दो चर समान हैं। निचे देखो:
var a = 1;
var b = a;
if (a == b){
...
}
a = 3;
b = 3;
if (a == b) {
...
}
इस मामले में, हम उम्मीद करते हैं कि दोनों बयानों में 'एक बराबरी बी'। और कुछ भी पागल होगा। भाषाओं के अधिकांश (यदि सभी नहीं) इस सम्मेलन का अनुसरण करते हैं। इसलिए, सरल प्रकार (उर्फ मूल्यों) के साथ हम जानते हैं कि कैसे अर्थ समानता को प्राप्त करना है। वस्तुओं के साथ, यह पूरी तरह से अलग कुछ हो सकता है। निचे देखो:
var a = new Something(1);
var b = a;
if (a == b){
...
}
b = new Something(1);
a.DoSomething();
b.DoSomething();
if (a == b) {
...
}
हम उम्मीद करते हैं कि पहला 'अगर' हमेशा सच होगा। लेकिन दूसरे 'अगर ’पर आप क्या उम्मीद करते हैं? यह वास्तव में निर्भर करता है। क्या 'DoSomething' a और b की समानता (अर्थ) को बदल सकता है?
शब्दार्थ समानता के साथ समस्या यह है कि यह स्वचालित रूप से वस्तुओं के लिए संकलक द्वारा उत्पन्न नहीं किया जा सकता है, न ही असाइनमेंट से स्पष्ट है । उपयोगकर्ता को शब्दार्थ समानता को परिभाषित करने के लिए एक तंत्र प्रदान किया जाना चाहिए। वस्तु-उन्मुख भाषाओं में, वह तंत्र एक विरासत में मिली विधि है: बराबर । OO कोड का एक टुकड़ा पढ़ना, हम सभी वर्गों में एक ही सटीक कार्यान्वयन के लिए एक विधि की उम्मीद नहीं करते हैं। हम विरासत और अधिभार के लिए उपयोग किया जाता है।
ऑपरेटरों के साथ, हालांकि, हम समान व्यवहार की उम्मीद करते हैं। जब आप 'a == b' देखते हैं, तो आपको सभी स्थितियों में एक ही प्रकार की समानता (4 से ऊपर) की अपेक्षा करनी चाहिए। तो, के लिए लक्ष्य स्थिरता भाषाओं सभी प्रकार के लिए इस्तेमाल किया संदर्भ समानता डिजाइनरों। यह इस बात पर निर्भर नहीं होना चाहिए कि एक प्रोग्रामर ने एक विधि को ओवरराइड किया है या नहीं।
पुनश्च: भाषा डी जावा और सी # से थोड़ी अलग है: बराबर ऑपरेटर का अर्थ है उपयोगकर्ता-परिभाषित वर्गों के लिए सरल प्रकार और अर्थ समानता के लिए उथले समानता (उपयोगकर्ता के साथ झूठ बोलने वाले = ऑपरेशन को लागू करने की जिम्मेदारी के लिए - कोई डिफ़ॉल्ट प्रदान नहीं किया जाता है)। के रूप में, सरल प्रकार के लिए, उथले समानता हमेशा शब्दार्थ समानता है, भाषा सुसंगत है। हालांकि, इसकी कीमत का भुगतान उपयोगकर्ता के परिभाषित प्रकारों के लिए डिफ़ॉल्ट ऑपरेटर द्वारा अपरिभाषित है। आपको इसे लागू करना होगा। और, कभी-कभी, यह सिर्फ उबाऊ है।