50 votes

Pourquoi NSOrderedSet n'hérite-t-il pas de NSSet?

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 ?

76voto

Tom Dalling Points 10656

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X