SORU
1 Temmuz 2012, Pazar


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
1 Temmuz 2012, Pazar


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chriselle Lim

    Chriselle Li

    26 Ocak 2008
  • ŠĩŗĜŕôŵåɭȍҭҭ

    ŠĩŗĜŕô

    29 Kasım 2009
  • soyacincautv

    soyacincautv

    14 NİSAN 2010