Objective-C 类别的概念是否类似于 mixins 的概念?如果是这样:有什么相似之处?在不:有什么区别?
4 回答
据我所知:
混合
- 组合的语法糖
- 由类的开发者而不是用户添加
- 可以被多个类重用
- 可以添加实例变量
- 可以在 Objective-C 中使用转发来实现
类别
- 类似于其他语言的扩展方法
- 通常由类的用户添加,而不是开发人员
- 仅由一个类及其子类使用
- 无法添加实例变量
需要明确的是,答案是否定的——它们不一样。
John Calsbeek 在接受的答案中概述了这些差异,但我想说关键的区别在于 mixins 可以在不同的类中使用,而类别总是只扩展一个类——它们在定义中声明。
这是关键的区别,因为这意味着这两个功能的用例完全不同。另一种看待它的方式是,如果您从 Ruby 转向 Objective-C 并且缺少您的 mixin,您将不会发现类别有任何乐趣。
mixin 的用例是你有一些代码——方法和实例变量——你想在几个没有公共超类的类中重用它们。你不能用类别来做到这一点。
Mixin 实际上是您在 Objective-C 中找不到的类型的“多重继承”。在objective-c 中最接近的是协议,就像Java 中最接近的是接口一样,但是它们既没有实例变量也没有方法体(在objective-C 或java 中)。因此,您通常只需要创建帮助类或将代码放入超类中。
Objective-c 类别的用例是您希望将方法添加到现有类——甚至是系统或库类。
我会说 mixins 更强大,但由于这是一个苹果与橘子的比较,它是没有意义的。
准确地说:
Ruby 等价于类别,是简单地重新打开要扩展的类并对其进行扩展。(你可以在 Ruby 中的任何地方这样做,它实际上与类别相同)
我不确定与 Mixins 等效的 Objective-c 是什么——有人吗?
[更新] 再多搜索一下,在 Objective-C 中没有与 Mixins 等效的东西,但有进取心的 Vladimir Mitrovic 创建了一个可以有效实现它的库。https://github.com/vl4dimir/ObjectiveMixin
对于是否使用它,我有两种看法:有时,如果您使用的语言不支持某些东西,使用它会更容易,而不是与之抗争或尝试从其他语言导入您喜欢的功能。(“如果你不能使用你喜欢的编程语言,那就爱你所使用的那个”)。
再说一次,也许这对我来说有点傲慢。多年来,整个面向方面的编程运动一直在为 Java 提供一些特性(但我可能会补充说,在 JBoss 之外从未获得过太大的吸引力)。无论如何,弗拉基米尔在他的例子中使用忍者神龟获得了额外的荣誉。
在另一个方面:作为一个相对的objective-c noob,在我看来,类别在我在网上找到的示例代码中被过度使用了。将静态辅助方法添加到具有类别的系统类中似乎很常见,因为在您的项目中创建一个辅助类来容纳这些方法同样容易,并且在更新系统类或导入时它们破坏的风险较小别人的图书馆有自己的此类类别。一个常见的例子是向 UIColor 添加新的静态颜色方法。为什么不将它们添加到本地课程中呢?
我见过的类别的一个非常好的用途是添加方法,而不是添加到系统类,而是添加到生成的类。因此,当您从核心数据对象模型生成类,并且想要添加真正属于模型类的新构造函数或其他方法时,您可以使用类别来执行此操作,这样您就可以在更改时安全地重新生成模型类您的模型,而不会丢失您的工作。
总而言之: - 忘记将类别作为 mixins 的解决方案 - 类别对核心数据有好处,但在其他方面被过度使用和高估
类别是为特定类定义的,据我所知,您无法创建类别并将其实现的方法添加到多个类中。
使用 mixin,您可以从基础和 mixin 派生一个新类,然后实例化这个新类以利用它。
使用类别,您实际上是直接添加基类,以便该基类的所有实例都可以访问该类别提供的功能。