আপনি কীভাবে সঠিকভাবে 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
?
( ব্রেন ফার্ট : মূলত এগুলি একসাথে "বিটওয়াইস ওআর" লিখেছিলেন |=
ant
if (![other isKindOfClass:[self class]])
- এর প্রযুক্তিগত অর্থ হল সাম্যতা পরিবর্তিত হবে না। আই এ = বি এর অর্থ বি = এ নয় (উদাহরণস্বরূপ যদি অন্যের সাবক্লাস হয়)