Neden't NSOrderedSet NSSet Devral değil mi?
Sıralı bir set bir set daha özel bir durum elbette, neden NSOrderedSet
NSSet
yerine NSObject
devralmıyor?
CEVAP
NSSet
ve haklısın, sıralı kümeler arayüzü Liskov substitution principle tatmin etmek için görünür ve NSSet
miras verir diye baktım.
Bu tatili bir yöntemi vardır: mutableCopy
. mutableCopy
dönüş değeri NSOrderedSet
NSMutableSet
ama NSMutableOrderedSet
gereken bir miras olmalı. Her ikisine de sahip olamaz.
Bana bazı kod ile açıklamama izin verin. İlk olarak, NSSet
NSMutableSet
doğru davranışları göz atalım:
NSSet* immutable = [NSSet set];
NSMutableSet* mutable = [immutable mutableCopy];
[mutable isKindOfClass:[NSSet class]]; // YES
[mutable isKindOfClass:[NSMutableSet class]]; // YES
Şimdi, ** 17 NSMutableOrderedSet
hadi NSOrderedSet
rol alır NSOrderedSet
grubunuz:
//Example 1
NSOrderedSet* immutable = [NSOrderedSet orderedSet];
NSMutableOrderedSet* mutable = [immutable mutableCopy];
[mutable isKindOfClass:[NSSet class]]; // YES
[mutable isKindOfClass:[NSMutableSet class]]; // NO (this is the problem)
NSMutableOrderedSet
NSMutableSet
yerine miras ne? O zaman farklı bir sorun ile karşılaşırız:
//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)
Örnek 1'de, davranışı farklı olduğundan, bir fonksiyon NSSet
bir bekliyor içine NSOrderedSet
geçmek mümkün olmaz. Temelde, geriye doğru bir uyumluluk sorunu var.
Örnek 2, yapamazsın, bir işlevi eski değil çünkü NSOrderedSet
beklentilerin içine NSMutableOrderedSet
ikinci devralır.
Bu NSMutableOrderedSet
olamaz çünkü tüm Objective-C çoklu kalıtım yok çünkü ikisi de NSMutableSet
NSOrderedSet
devralır. Bunu aşmanın yolu NSMutableOrderedSet
her iki iletişim kurallarını uygulamak çünkü NSMutableSet
NSOrderedSet
için protokoller yapmaktır. Sadece ekstra protokolleri olmadan daha basit olmasına rağmen Apple geliştiriciler sanırım.
Neden't GCC*****a (**)*(**) optim...
Neden' ◎ܫ◎ ve fonksiyonu t JavaSc...
Neden boyutu(x ) x artım değil mi?...
Neden Java statik olarak bir sınıf bil...
Neden't JUnit assertNotEquals yön...