我有两个isEqual
方法,如下所示:
- (BOOL)isEqualToObject:(IdentifiableObject *)object {
if ([self identifier] == [object identifier])
return YES;
return NO;
}
- (BOOL)isEqual:(id)otherObject {
if (otherObject == self)
return YES;
else if (!otherObject || ![otherObject isKindOfClass:[self class]])
return NO;
return [self isEqualToObject:otherObject];
}
这是放在其他类继承的通用超类中。
这会按预期(或我想要的)工作吗?或者isEqual
方法应该放在每个子类中?
答案 0 :(得分:2)
由于您的子类将继承此方法,因此它可以按预期工作。在isEqual:
方法中,您使用self
,因此您指的是当前的类实例。
这是一个例子:
@interface ClassA : NSObject
@property (nonatomic,strong) NSString* myName;
@end
// -------
@implementation ClassA
- (BOOL)isEqualToObject:(ClassA *)object {
if (self.myName == object.myName)
return YES;
return YES;
}
- (BOOL)isEqual:(id)otherObject {
if (otherObject == self)
return YES; // instead of "![otherObject isKindOfClass:[self class]]"
else if (!otherObject || !([otherObject class] == [self class]))
return NO;
return [self isEqualToObject:otherObject];
}
@end
样本用法
ClassA* a1 = [[ClassA alloc]init];
ClassA* a2 = [[ClassA alloc]init];
a1.myName = @"joe";
a2.myName = @"joe";
ClassB* b1 = [[ClassB alloc]init];
ClassB* b2 = [[ClassB alloc]init];
b1.myName = @"frank";
b2.myName = @"frank";
ClassC* c1 = [[ClassC alloc]init];
ClassC* c2 = [[ClassC alloc]init];
c1.myName = @"donnie";
c2.myName = @"donnie";
NSLog(@" a1 == a2 -> %hhd",[a1 isEqual:a2]); // Match
NSLog(@" b1 == b2 -> %hhd",[b1 isEqual:b2]); // Match
NSLog(@" c1 == c2 -> %hhd",[c1 isEqual:c2]); // Match
NSLog(@" a1 == b1 -> %hhd",[a1 isEqual:b1]); // Doesn't match
NSLog(@" b1 == c1 -> %hhd",[b1 isEqual:c1]); // Doesn't match
NSLog(@" c1 == a1 -> %hhd",[c1 isEqual:a1]); // Doesn't match
答案 1 :(得分:1)
它将在界限内工作......
如果您实施isEqual:
,您还应该实施hash
,以便保持相等要求。如果不这样做,并且将自定义对象放入集合中,则可能会产生一些意外结果。
您的自定义实现也不会考虑子类自定义属性,除非它们覆盖超类实现。这是否是一个问题取决于你如何定义平等。
在很多情况下,最好不要覆盖isEqual:
,而是添加自己的自定义比较方法 - 但是,这取决于您希望如何使用相等性。
基本上,要小心覆盖的内容并确保满足所有相应的相等要求。