संपादित
मैं सिर्फ क्या आपने देखा वर्ग समानता, नहीं instanceof
इस्तेमाल किया - जिसका अर्थ है कि रिफ्लेक्सिविटी सही होगा। आपके उदाहरण में, super.equals
का उपयोग शायद सही है, जब तक कि सुपरक्लस समानता की परिभाषा प्रदान नहीं करता है जो कि आपके उप-वर्ग की इच्छा है (उदाहरण के लिए Object
करता है)।
मुख्य बिंदु यह है कि समानता की परिभाषा आपके वर्ग के पदानुक्रम में बिल्कुल एक प्रकार (कक्षा या इंटरफ़ेस) से आनी चाहिए। यदि उस परिभाषा के कार्यान्वयन में super.equals
का लाभ होता है, तो यह ठीक है।
अंत संपादित, नीचे
मूल पाठ यह लगभग निश्चित रूप क्या करना गलत बात है, क्योंकि यह समानता के चिंतनशील संपत्ति का उल्लंघन होगा।
मान लीजिए कि आपके पास एक आकार है, और यह एक और आकार के बराबर है यदि वे एक ही प्रकार के हैं: स्क्वायर स्क्वायर बराबर है, सर्किल सर्किल के बराबर है, आदि। अब आप इसे रंगीन स्क्वायर बनाने के लिए बढ़ाते हैं जो रंगीन जांच जोड़ता है।
Shape shape1 = new Shape(SQUARE);
Shape shape2 = new ColoredShape(SQUARE, RED);
आप super.equals(other) && other.color == this.color
रूप ColoredSquare.equals
लागू, आपके सवाल में के रूप में। लेकिन अब, ध्यान दें कि shape1.equals(shape2) == true
(shape1
के बाद से Shape.equals
का उपयोग करता है), लेकिन shape2.equals(shape1) == false
(क्योंकि यह रंग जांच जोड़ता है)।
कहानी का नैतिक यह है कि इस प्रकार की कैस्केडिंग समानता का उपयोग करना वास्तव में कठिन है, अगर असंभव नहीं है। असल में, समानता आपके प्रकार के पदानुक्रम के भीतर बिल्कुल एक प्रकार से आनी चाहिए - चाहे वह Object
हो, चाहे आपका प्रकार, एक सुपर टाइप, या कुछ इंटरफ़ेस जो अनुबंध को परिभाषित करता है (उदाहरण के लिए संग्रह ढांचे में, जो Set
, List
आदि के लिए समानता को परिभाषित करता है।)।
पीएस मुझे लगता है कि अभिभावक वर्ग ऑब्जेक्ट नहीं है और 'बराबर' और 'हैशकोड' की सही परिभाषा दे रहा है। –