Certes, un ensemble ordonné est un cas plus spécifique d'un ensemble, alors pourquoi NSOrderedSet
hérite-t-il de NSObject
plutôt que de NSSet
?
Réponse
Trop de publicités?Je suis passé par l'interface d' NSSet
et vous avez raison, ensembles ordonnés semble satisfaire le principe de substitution de Liskov et pourrait à cet effet hériter d' NSSet
.
Il y a un peu de méthode qui rompt ce: mutableCopy
. La valeur de retour de l' mutableCopy
doit être un NSMutableSet
, mais NSMutableOrderedSet
devrait hériter de NSOrderedSet
. Vous ne pouvez pas avoir les deux.
Laissez-moi vous expliquer avec un peu de code. Tout d'abord, regardons le bon comportement de l' NSSet
et NSMutableSet
:
NSSet* immutable = [NSSet set];
NSMutableSet* mutable = [immutable mutableCopy];
[mutable isKindOfClass:[NSSet class]]; // YES
[mutable isKindOfClass:[NSMutableSet class]]; // YES
Maintenant, imaginons NSOrderedSet
hérite NSSet
, et NSMutableOrderedSet
hérite 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)
Que faire si NSMutableOrderedSet
héritées de l' NSMutableSet
à la place? Puis, nous avons un problème différent:
//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)
Dans l'Exemple 1, vous ne pouvez pas être en mesure de passer à une NSOrderedSet
dans une fonction qui attend une NSSet
parce que le comportement est différent. En gros, c'est un problème de rétro-compatibilité.
Dans l'Exemple 2, vous ne pouvez pas passer un NSMutableOrderedSet
dans une fonction qui attend une NSOrderedSet
parce que l'ancien ne veut pas hériter de ce dernier.
Tout cela, c'est parce qu' NSMutableOrderedSet
ne peut pas hériter de deux NSMutableSet
et NSOrderedSet
parce que Objective-C n'a pas l'héritage multiple. Le moyen de contourner ce problème est de faire de protocoles pour l' NSMutableSet
et NSOrderedSet
, car alors NSMutableOrderedSet
peut mettre en œuvre des deux protocoles. Je suppose que les développeurs Apple juste si c'était plus simple sans les protocoles.