gpt4 book ai didi

objective-c - 为什么 NSOrderedSet 不继承自 NSSet?

转载 作者:IT老高 更新时间:2023-10-28 11:35:00 25 4
gpt4 key购买 nike

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

最佳答案

我通过了 NSSet 的接口(interface),你是对的,有序集合似乎满足 Liskov substitution principle因此可以从 NSSet 继承。

有一个小方法可以解决这个问题:mutableCopymutableCopy 的返回值必须是 NSMutableSet,但 NSMutableOrderedSet 应该继承自 NSOrderedSet。你不能两者兼得。

让我用一些代码来解释一下。首先,我们看一下NSSetNSMutableSet的正确行为:

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 中,您无法将 NSOrderedSet 传递给需要 NSSet 的函数,因为行为不同。基本上,这是一个向后兼容性问题。

在示例 2 中,您不能将 NSMutableOrderedSet 传递给需要 NSOrderedSet 的函数,因为前者不会从后者继承。

所有这一切都是因为 NSMutableOrderedSet 不能同时继承自 NSMutableSetNSOrderedSet 因为 Objective-C 没有多重继承。解决这个问题的方法是为 NSMutableSetNSOrderedSet 制定协议(protocol),因为这样 NSMutableOrderedSet 可以实现这两种协议(protocol)。我猜 Apple 开发人员只是在没有额外协议(protocol)的情况下更简单。

关于objective-c - 为什么 NSOrderedSet 不继承自 NSSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11278995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com