Тест isKindOfClass в методе isEqual с наследованием - PullRequest
2 голосов
/ 29 февраля 2012

Я видел много реализаций 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 были равны, как бы я поступил? Что является обычной практикой в ​​этом сценарии?

...