我见过很多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
测试)。如果我希望DerivedA
和DerivedB
的某些实例相同,我该如何处理呢?这种情况下的常见做法是什么?