为什么NSOrderedSet不是从NSSetinheritance的?

当然,有序集是一个集合的更具体的情况,所以为什么NSOrderedSetinheritanceNSObject而不是NSSet

我经历了NSSet的接口,你是对的,有序集似乎满足Liskov替代原则,并可以从NSSetinheritance。

有一个方法可以打破这个问题: mutableCopymutableCopy的返回值必须是一个NSMutableSet ,但NSMutableOrderedSet应该从NSOrderedSetinheritance。 你不能有两个。

让我解释一些代码。 首先,我们来看看NSSetNSMutableSet的正确行为:

 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) 

如果NSMutableOrderedSetNSMutableSetinheritance而来呢? 然后我们得到一个不同的问题:

 //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不能从NSMutableSetNSOrderedSetinheritance,因为Objective-C没有多重inheritance。 解决这个问题的方法是为NSMutableSetNSOrderedSet创build协议,因为NSMutableOrderedSet可以实现两个协议。 我想苹果开发者只是没有额外的协议就简单了。