Z pewnością uporządkowany zbiór jest bardziej konkretnym przypadkiem zbioru, więc dlaczego NSOrderedSet
dziedziczy po NSObject
zamiast?Dlaczego NSOrderedSet nie dziedziczy po NSSet?
Odpowiedz
Przeszedłem przez interfejs NSSet
i masz rację, zamówione zestawy wydają się spełniać Liskov substitution principle i mogą tam odziedziczyć po NSSet
.
Jest jedna mała metoda, która to łamie: mutableCopy
. Wartość zwracana wynosząca mutableCopy
musi wynosić NSMutableSet
, ale NSMutableOrderedSet
powinna odziedziczyć po NSOrderedSet
. Nie możesz mieć obu.
Pozwól mi wyjaśnić za pomocą kodu. Po pierwsze, spójrzmy na prawidłowym zachowaniu NSSet
i NSMutableSet
:
NSSet* immutable = [NSSet set];
NSMutableSet* mutable = [immutable mutableCopy];
[mutable isKindOfClass:[NSSet class]]; // YES
[mutable isKindOfClass:[NSMutableSet class]]; // YES
Teraz udawajmy NSOrderedSet
dziedziczy NSSet
i NSMutableOrderedSet
dziedziczy 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)
Co jeśli NSMutableOrderedSet
odziedziczone NSMutableSet
zamiast? Następnie mamy inny problem:
//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)
W przykładzie 1, nie będzie w stanie przekazać NSOrderedSet
do funkcji oczekując NSSet
ponieważ zachowanie jest inny. Zasadniczo jest to problem kompatybilności wstecznej.
W przykładzie 2 nie można przekazać funkcji NSMutableOrderedSet
do funkcji, która wymaga NSOrderedSet
, ponieważ pierwsza nie dziedziczy z drugiej.
Wszystko dlatego, że NSMutableOrderedSet
nie może dziedziczyć zarówno z NSMutableSet
, jak i NSOrderedSet
, ponieważ Objective-C nie ma dziedziczenia wielokrotnego. Aby obejść ten problem, należy utworzyć protokoły dla NSMutableSet
i NSOrderedSet
, ponieważ wtedy NSMutableOrderedSet
może zaimplementować oba protokoły. Sądzę, że programiści Apple po prostu byli prostsi bez dodatkowych protokołów.
Myślę, że protokoły miałyby więcej sensu - mogłoby to być bardziej związane z faktem, że 'NSMutableSet' został już zdefiniowany i jeszcze nie użył protokołu dla zmienności.Czy nie można jeszcze dodać protokołu pomimo faktu, że 'NSMutableSet' jest już zgodny z tym protokołem? – jhabbott
Gdyby chcieli, mogliby dodać nowy protokół bez niszczenia czegokolwiek. Możemy to zobaczyć w przyszłości. –
Świetna odpowiedź, to zostało użyte w książce NSHipster, tak znalazłem to pytanie ... czy wiesz, dlaczego książka NSHipster łączy ten problem bezpośrednio z NSSet będącym klastrem klasy ?, po prostu nie widzę, jak gdyby NSSet był konkretną klasę, która byłaby inna niż zmienna kwestia kopiowania, czy wiesz? http://nshipster.com/nsorderedset/ –
- 1. Swift: CoreData i ogólny NSOrderedSet
- 2. Dlaczego podklasa nie dziedziczy stałych rodzica?
- 3. Dlaczego Int nie dziedziczy/nie rozszerza się z zamówionego [Int]
- 4. Android XML dziedziczy po dwóch motywach rodzica?
- 5. Bizarre NSSet copying crash
- 6. Wyjątek pochodny nie dziedziczy konstruktorów
- 7. Selektor dziedziczy
- 8. Uzyskiwanie obiektu z NSSet
- 9. Jak wyświetlić NSSet w UITableView?
- 10. Gdzie się dowiedzieć/sprawdzić: Int32 dziedziczy po ValueType, ValueType dziedziczy z Object?
- 11. Wyszukiwanie NSString w NSSet
- 12. "NSSet allObjects" porządkuje losowo?
- 13. Nie można zmienić kolejności relacji NSOrderedSet w danych podstawowych
- 14. Razor typ widoku nie dziedziczy z 'System.Web.WebPages.WebPage'
- 15. Zamówione zestawy i podstawowe dane (NSOrderedSet)
- 16. NSOrderedSet odpowiedź od serwera i danych Core
- 17. {@initit} nie dziedziczy superklasy javadoc w Eclipse
- 18. Co to jest typ Ta struktura dziedziczy po?
- 19. Usuń obiekt w relacji NSSet
- 20. W .Net, czy możliwe jest użycie Response.Write w klasie, która nie dziedziczy po System.Web.UI.Page
- 21. Dlaczego klasa podrzędna nie dziedziczy metody z klasy nadrzędnej w pythonie w tym przykładzie?
- 22. NSDictionary allKeys zwraca NSArray, zamiast NSSet
- 23. Kakao NSArray/NSSet: -makeObjectsPerformSelector: kontra szybkie wyliczenie
- 24. Atrybut 'content' dziedziczy wartość węzła
- 25. Dlaczego jabłko używa NSOrderedSet zamiast NSArray dla uporządkowanej mutli value relacji w CoreData?
- 26. Dlaczego słowo "nie pojawia się" po uruchomieniu?
- 27. Dlaczego usługa nie uruchamia się po BOOT_COMPLETED?
- 28. Dlaczego folder nie istnieje po utworzeniu?
- 29. Dlaczego przeglądarka nie wyświetla favicon po wdrożeniu
- 30. Jaki jest najskuteczniejszy sposób sortowania NSSet?
Jeśli program developer.apple.com nie był wyłączony, powinienem przejrzeć dokumentację, ponieważ teraz jestem ciekawy! Doskonałe pytanie. I mam nadzieję, że strona Apple nie pozostanie zbyt długo niedostępna, prawda? – WendiKidd
(Disclaimer: To jest czysta spekulacja i zbyt mało przekonująca dla mnie, aby chcieć ją przedstawić jako odpowiedź, ale ...) 'NSOrderedSet' jest bardziej specyficznym przypadkiem zarówno NSSet, jak i NSArray' . Są to zarówno klasy nie protokoły, i nie ma wielu dziedziczenia w Objective-C. Więc, które wybierasz? Istnieje argument "NSSet" ze względu na nazwę, ale może to być "NSUniqueArray", prawda? Graj bezpiecznie, porzuć oba ... –
Widzę dokładnie to, co mówisz, ale masz rację, że nie jest to aż tak przekonujące. Intuicyjnie oczekiwałbym, że '[asetet intersectsSet: anOrderedSet]' będzie możliwy (ale nie jest tak, ponieważ 'NSOrderedSet' nie jest podklasą' NSSet'), więc 'NSSet' czyni o wiele bardziej logiczny wybór dla nadklasy niż' NSArray' - i nawet jeśli dokonali równie logicznych wyborów, utrata polimorfizmu i tak nie wybrała ani gorszej opcji. – jhabbott