Я видел много реализаций isEqual
использования isKindOfClass
, подобных следующему:
- (BOOL) isEqual:(id)object {
if ([object isKindOfClass:[self class])
return [self testEqualityFurther];
}
Если у меня есть такая иерархия:
База: NSObject
Производное: База
и базовый класс должны были реализовать описанный выше метод для isEqual
, тогда предположим, что 'b' - это экземпляр Base
, а 'd' - это экземпляр Derived
, [d isEqual: b] может быть истина, но [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
Если бы я добавил метод isEqual
в базовый класс (аналогично методу isEqual
, описанному выше), я бы не смог получить экземпляр DerivedA
, равный DerivedB
(из-за теста isKindOfClass
). Если бы я хотел, чтобы некоторые экземпляры DerivedA
и DerivedB
были равны, как бы я поступил? Что является обычной практикой в этом сценарии?