为什么NSOrderedSet不是从NSSetinheritance的?
当然,有序集是一个集合的更具体的情况,所以为什么NSOrderedSet
inheritanceNSObject
而不是NSSet
?
我经历了NSSet
的接口,你是对的,有序集似乎满足Liskov替代原则,并可以从NSSet
inheritance。
有一个方法可以打破这个问题: mutableCopy
。 mutableCopy
的返回值必须是一个NSMutableSet
,但NSMutableOrderedSet
应该从NSOrderedSet
inheritance。 你不能有两个。
让我解释一些代码。 首先,我们来看看NSSet
和NSMutableSet
的正确行为:
NSSet* immutable = [NSSet set]; NSMutableSet* mutable = [immutable mutableCopy]; [mutable isKindOfClass:[NSSet class]]; // YES [mutable isKindOfClass:[NSMutableSet class]]; // YES
现在,假设NSOrderedSet
inheritance自NSSet
,并且NSMutableOrderedSet
inheritance自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
inheritance而来呢? 然后我们得到一个不同的问题:
//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
不能从NSMutableSet
和NSOrderedSet
inheritance,因为Objective-C没有多重inheritance。 解决这个问题的方法是为NSMutableSet
和NSOrderedSet
创build协议,因为NSMutableOrderedSet
可以实现两个协议。 我想苹果开发者只是没有额外的协议就简单了。