为什么不从NSOrderedSet继承的NSSet?(Why doesn't NSOrder

2019-07-30 04:55发布

当然有序集是一个更具体的情况,所以为什么NSOrderedSet继承NSObject ,而不是NSSet

Answer 1:

我经过的接口去NSSet和你说的没错,有序集合出现,以满足里氏替换原则 ,并可能为此继承NSSet

有打破这个小方法: mutableCopy 。 的返回值mutableCopy必须是NSMutableSet ,但NSMutableOrderedSet应该继承NSOrderedSet 。 你不能兼得。

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

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不能既继承NSMutableSetNSOrderedSet因为Objective-C的不具有多重继承。 要解决这个问题的方法是使对协议NSMutableSetNSOrderedSet ,因为那时NSMutableOrderedSet可以实现两个协议。 我想苹果开发者只需虽然当时没有额外的协议简单。



文章来源: Why doesn't NSOrderedSet inherit from NSSet?