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.