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

  • AverageBroTV

    AverageBroTV

    20 Mart 2013
  • midomansour

    midomansour

    19 EYLÜL 2009
  • stokelycalm

    stokelycalm

    28 Aralık 2010