当然有序集是一个更具体的情况,所以为什么NSOrderedSet
继承NSObject
,而不是NSSet
?
Answer 1:
我经过的接口去NSSet
和你说的没错,有序集合出现,以满足里氏替换原则 ,并可能为此继承NSSet
。
有打破这个小方法: 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
可以实现两个协议。 我想苹果开发者只需虽然当时没有额外的协议简单。
文章来源: Why doesn't NSOrderedSet inherit from NSSet?