为什么NSOrderedSet不是从NSSetinheritance的?
当然,有序集是一个集合的更具体的情况,所以为什么NSOrderedSetinheritanceNSObject而不是NSSet ?
我经历了NSSet的接口,你是对的,有序集似乎满足Liskov替代原则,并可以从NSSetinheritance。
有一个方法可以打破这个问题: mutableCopy 。 mutableCopy的返回值必须是一个NSMutableSet ,但NSMutableOrderedSet应该从NSOrderedSetinheritance。 你不能有两个。
让我解释一些代码。 首先,我们来看看NSSet和NSMutableSet的正确行为:
NSSet* immutable = [NSSet set]; NSMutableSet* mutable = [immutable mutableCopy]; [mutable isKindOfClass:[NSSet class]]; // YES [mutable isKindOfClass:[NSMutableSet class]]; // YES
现在,假设NSOrderedSetinheritance自NSSet ,并且NSMutableOrderedSetinheritance自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从NSMutableSetinheritance而来呢? 然后我们得到一个不同的问题:
//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的函数,因为前者不会从后者inheritance。
所有这一切都是因为NSMutableOrderedSet不能从NSMutableSet和NSOrderedSetinheritance,因为Objective-C没有多重inheritance。 解决这个问题的方法是为NSMutableSet和NSOrderedSet创build协议,因为NSMutableOrderedSet可以实现两个协议。 我想苹果开发者只是没有额外的协议就简单了。