当然,有序集合是集合的更具体的情况,那么为什么NSOrderedSet继承自NSObject而不是NSSet
发布于 2012-07-01 10:48:19
我通过NSSet的接口,你是对的,有序集似乎满足Liskov substitution principle,因此可以从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中,您不能向期望NSSet的函数传递NSOrderedSet,因为行为不同。基本上,这是一个向后兼容性问题。
在示例2中,不能向需要NSOrderedSet的函数传递NSMutableOrderedSet,因为前者不是从后者继承的。
所有这些都是因为NSMutableOrderedSet不能同时从NSMutableSet和NSOrderedSet继承,因为Objective-C没有多重继承。解决这个问题的方法是为NSMutableSet和NSOrderedSet制定协议,因为这样NSMutableOrderedSet就可以同时实现这两种协议。我猜苹果的开发人员只是因为没有额外的协议而变得更简单。
https://stackoverflow.com/questions/11278995
复制相似问题