51

当然,有序集合是集合的更具体的情况,那么为什么NSOrderedSet继承 fromNSObject而不是NSSet呢?

4

1 回答 1

77

我通过了界面,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可以实现这两种协议。我猜苹果开发人员只是在没有额外协议的情况下更简单。

于 2012-07-01T02:48:19.093 回答