当然,有序集合是集合的更具体的情况,那么为什么NSOrderedSet
继承 fromNSObject
而不是NSSet
呢?
1 回答
我通过了界面,NSSet
你是对的,有序集似乎满足Liskov 替换原则,因此可以继承自NSSet
.
有一个小方法可以解决这个问题:mutableCopy
. 的返回值mutableCopy
必须是NSMutableSet
,但NSMutableOrderedSet
应该继承自NSOrderedSet
。你不能两者兼得。
让我用一些代码解释一下。首先,让我们看看NSSet
and的正确行为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 没有多重继承。解决这个问题的方法是为NSMutableSet
and制定协议NSOrderedSet
,因为 thenNSMutableOrderedSet
可以实现这两种协议。我猜苹果开发人员只是在没有额外协议的情况下更简单。