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 नहीं है (जैसे यदि एक दूसरे का उपवर्ग है)