当然,有序集合是集合的更具体的情况,那么为什么NSOrderedSet继承 fromNSObject而不是NSSet呢?
1 回答
我通过了界面,NSSet你是对的,有序集似乎满足Liskov 替换原则,因此可以继承自NSSet.
有一个小方法可以解决这个问题:mutableCopy. 的返回值mutableCopy必须是NSMutableSet,但NSMutableOrderedSet应该继承自NSOrderedSet。你不能两者兼得。
让我用一些代码解释一下。首先,让我们看看NSSetand的正确行为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 中,您将无法将 an 传递NSOrderedSet给期望 an 的函数,NSSet因为行为不同。基本上,这是一个向后兼容性问题。
在示例 2 中,您不能将 an 传递NSMutableOrderedSet给期望 an 的函数,NSOrderedSet因为前者不会从后者继承。
所有这一切都是因为NSMutableOrderedSet不能从两者继承,NSMutableSet并且NSOrderedSet因为 Objective-C 没有多重继承。解决这个问题的方法是为NSMutableSetand制定协议NSOrderedSet,因为 thenNSMutableOrderedSet可以实现这两种协议。我猜苹果开发人员只是在没有额外协议的情况下更简单。