確かに、順序集合は集合のより具体的なケースですが、なぜではなくNSOrderedSet
から継承するのですか?NSObject
NSSet
1 に答える
私はのインターフェースを通り抜けました、NSSet
そしてあなたは正しいです、順序集合はリスコフの置換原則を満たしているように見え、それ故にから継承することができますNSSet
。
これを破る小さな方法が1つありますmutableCopy
。の戻り値はであるmutableCopy
必要がありますが、NSMutableSet
からNSMutableOrderedSet
継承する必要がありますNSOrderedSet
。両方を持つことはできません。
いくつかのコードで説明しましょう。NSSet
まず、との正しい動作を見てみましょうNSMutableSet
:
NSSet* immutable = [NSSet set];
NSMutableSet* mutable = [immutable mutableCopy];
[mutable isKindOfClass:[NSSet class]]; // YES
[mutable isKindOfClass:[NSMutableSet class]]; // YES
NSOrderedSet
さて、から継承しNSSet
、からNSMutableOrderedSet
継承するふりをしましょう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)
代わりにNSMutableOrderedSet
継承された場合はどうなりますか?NSMutableSet
次に、別の問題が発生します。
//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)
例1では、動作が異なるため、NSOrderedSet
を期待する関数にを渡すことはできません。NSSet
基本的に、これは下位互換性の問題です。
例2では、前者は後者を継承しないため、NSMutableOrderedSet
を期待する関数にを渡すことはできません。NSOrderedSet
これはすべて、NSMutableOrderedSet
両方から継承できないためでNSMutableSet
ありNSOrderedSet
、Objective-Cには多重継承がないためです。これを回避する方法は、NSMutableSet
とのプロトコルを作成することです。これは、両方のプロトコルを実装できるNSOrderedSet
ためです。NSMutableOrderedSet
Appleの開発者は、追加のプロトコルがなくても簡単だったと思います。