isEqual:
ऑब्जेक्टिव-सी में आप कैसे ठीक से ओवरराइड करते हैं ? "पकड़" ऐसा लगता है कि यदि दो वस्तुएं समान हैं (जैसा कि निर्धारित किया गया है)isEqual:
विधि है), उनके पास समान हैश मान होना चाहिए।
आत्मनिरीक्षण की धारा कोको बुनियादी बातों गाइड कैसे ओवरराइड करने के लिए एक उदाहरण है isEqual:
, इस प्रकार की नकल की, नाम के एक वर्ग के लिए MyWidget
:
- (BOOL)isEqual:(id)other {
if (other == self)
return YES;
if (!other || ![other isKindOfClass:[self class]])
return NO;
return [self isEqualToWidget:other];
}
- (BOOL)isEqualToWidget:(MyWidget *)aWidget {
if (self == aWidget)
return YES;
if (![(id)[self name] isEqual:[aWidget name]])
return NO;
if (![[self data] isEqualToData:[aWidget data]])
return NO;
return YES;
}
यह सूचक समानता, फिर वर्ग समानता की जांच करता है, और अंत में उपयोग करने वाली वस्तुओं की तुलना isEqualToWidget:
करता है, जो केवल name
और data
गुणों की जांच करता है । उदाहरण क्या नहीं दिखाता है कि कैसे ओवरराइड करना है hash
।
मान लीजिए कि अन्य गुण हैं जो समानता को प्रभावित नहीं करते हैं, कहते हैं age
। क्या hash
विधि को इस तरह से ओवरराइड नहीं किया जाना चाहिए name
और केवल data
हैश को प्रभावित करना चाहिए ? और यदि हां, तो आप ऐसा कैसे करेंगे? बस name
और की राख जोड़ें data
? उदाहरण के लिए:
- (NSUInteger)hash {
NSUInteger hash = 0;
hash += [[self name] hash];
hash += [[self data] hash];
return hash;
}
क्या यह पर्याप्त है? क्या कोई बेहतर तकनीक है? क्या होगा यदि आपके पास आदिम हैं, जैसे int
? उन्हें NSNumber
अपने हैश पाने के लिए परिवर्तित करें ? या संरचना पसंद है NSRect
?
( मस्तिष्क गोज़ : मूल रूप से "बिटवाइड या" उन्हें एक साथ लिखा |=
। मीट एड।)
if (![other isKindOfClass:[self class]])
- तकनीकी रूप से इसका मतलब समानता समानता नहीं होगी। Ie A = B का अर्थ B = A नहीं है (जैसे यदि एक दूसरे का उपवर्ग है)