objective-c ios nsset nsorderedset

objective c - ¿Por qué NSOrderedSet no hereda de NSSet?



objective-c ios (1)

Seguramente un conjunto ordenado es un caso más específico de un conjunto, así que ¿por qué NSOrderedSet hereda de NSObject lugar de NSSet ?


Pasé por la interfaz de NSSet y tiene razón, los conjuntos ordenados parecen satisfacer el principio de sustitución de Liskov y, por lo tanto, podrían heredarse de NSSet .

Hay un pequeño método que rompe esto: mutableCopy . El valor de retorno de mutableCopy debe ser un NSMutableSet , pero NSMutableOrderedSet debe heredar de NSOrderedSet . No puedes tener ambos.

Déjame explicarte con algún código. Primero, veamos el comportamiento correcto de NSSet y NSMutableSet :

NSSet* immutable = [NSSet set]; NSMutableSet* mutable = [immutable mutableCopy]; [mutable isKindOfClass:[NSSet class]]; // YES [mutable isKindOfClass:[NSMutableSet class]]; // YES

Ahora, supongamos que NSOrderedSet hereda de NSSet , y NSMutableOrderedSet hereda de NSOrderedSet :

//Example 1 NSOrderedSet* immutable = [NSOrderedSet orderedSet]; NSMutableOrderedSet* mutable = [immutable mutableCopy]; [mutable isKindOfClass:[NSSet class]]; // YES [mutable isKindOfClass:[NSMutableSet class]]; // NO (this is the problem)

¿Qué NSMutableOrderedSet si NSMutableOrderedSet hereda de NSMutableSet en NSMutableSet lugar? Entonces tenemos un problema diferente:

//Example 2 NSOrderedSet* immutable = [NSOrderedSet orderedSet]; NSMutableOrderedSet* mutable = [immutable mutableCopy]; [mutable isKindOfClass:[NSSet class]]; // YES [mutable isKindOfClass:[NSMutableSet class]]; // YES [mutable isKindOfClass:[NSOrderedSet class]]; // NO (this is a problem)

En el Ejemplo 1, no podría pasar un NSOrderedSet a una función que espera un NSSet porque el comportamiento es diferente. Básicamente, es un problema de compatibilidad hacia atrás.

En el Ejemplo 2, no puede pasar un NSMutableOrderedSet a una función que espera un NSOrderedSet porque el primero no hereda de este último.

Todo esto se debe a que NSMutableOrderedSet no puede heredar de NSMutableSet y NSOrderedSet porque Objective-C no tiene herencia múltiple. La forma de NSMutableSet esto es hacer protocolos para NSMutableSet y NSOrderedSet , porque entonces NSMutableOrderedSet puede implementar ambos protocolos. Supongo que los desarrolladores de Apple pensaron que era más sencillo sin los protocolos adicionales.