面向对象 - 超类中的iOS isEqual方法,它是否适用于子类?

时间:2014-01-24 11:12:03

标签: ios objective-c oop inheritance

我有两个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方法应该放在每个子类中?

2 个答案:

答案 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:,而是添加自己的自定义比较方法 - 但是,这取决于您希望如何使用相等性。

基本上,要小心覆盖的内容并确保满足所有相应的相等要求。