首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么NSOrderedSet不继承NSSet?

为什么NSOrderedSet不继承NSSet?
EN

Stack Overflow用户
提问于 2012-07-01 09:41:53
回答 1查看 5.7K关注 0票数 51

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-01 10:48:19

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

有一个小方法可以打破这一点:mutableCopymutableCopy的返回值必须为NSMutableSet,但NSMutableOrderedSet应继承自NSOrderedSet。你不能两者兼得。

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

代码语言:javascript
复制
NSSet* immutable = [NSSet set];
NSMutableSet* mutable = [immutable mutableCopy];

[mutable isKindOfClass:[NSSet class]]; // YES
[mutable isKindOfClass:[NSMutableSet class]]; // YES

现在,让我们假设NSOrderedSet继承自NSSetNSMutableOrderedSet继承自NSOrderedSet

代码语言:javascript
复制
//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会怎么样呢?然后我们得到了一个不同的问题:

代码语言:javascript
复制
//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不能同时从NSMutableSetNSOrderedSet继承,因为Objective-C没有多重继承。解决这个问题的方法是为NSMutableSetNSOrderedSet制定协议,因为这样NSMutableOrderedSet就可以同时实现这两种协议。我猜苹果的开发人员只是因为没有额外的协议而变得更简单。

票数 77
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11278995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档