带有继承的isEqual方法中的isKindOfClass测试

时间:2012-02-28 21:52:46

标签: objective-c inheritance equality

我见过很多isEqual使用isKindOfClass的实现,类似于以下内容:

- (BOOL) isEqual:(id)object {
    if ([object isKindOfClass:[self class])
        return [self testEqualityFurther];
}

如果我有这样的层次结构:

基地:NSObject

派生:基地

并且Base类要为isEqual实现上述方法,假设'b'是Base的实例而'd'是Derived的实例,[d isEqual:b]可能是true,但[b isEqual:d]永远不会(因为[d isKindOfClass:b]为真,但[b isKindOfClass:d]永远不会)。

这是否违反了某些平等法则,如果a等于b则b等于a?如果我(作为编码员)希望他们平等怎么办?

有关进一步的信息,我问这个是因为我希望有类似这样的情况:

@interface Base : NSObject
// An abstract class that cannot be init ed
@end

@interface DerivedA : Base
@end

@interface DerivedB : Base
@end

如果我要向Base类添加isEqual方法(类似于上面的isEqual方法),那么我将无法获得DerivedA的实例永远等于DerivedB(因为isKindOfClass测试)。如果我希望DerivedADerivedB的某些实例相同,我该如何处理呢?这种情况下的常见做法是什么?

0 个答案:

没有答案