代码之家  ›  专栏  ›  技术社区  ›  teabot

Objective-C类别与Mixins的比较

  •  16
  • teabot  · 技术社区  · 17 年前

    Objective-C类别的概念是否与Mixin的概念相似?如果是:有什么相似之处?在not中:有什么区别?

    4 回复  |  直到 17 年前
        1
  •  17
  •   John Calsbeek    17 年前

    据我所知:

    混血儿

    • 作文的句法分析
    • 由类的开发人员而不是用户添加
    • 可以被多个类重用
    • 可以添加实例变量
    • 可以使用Objective-C中的转发来实现

    类别

    • 类似于其他语言中的扩展方法
    • 通常由类的用户而不是开发人员添加
    • 仅由一个类及其子类使用
    • 无法添加实例变量
        2
  •  7
  •   Rhubarb    13 年前

    明确地说,答案是否定的——它们不一样。

    John Calsbeek在接受的答案中概述了这些差异,但我想说的是,关键的区别在于mixin可以在不同的类中使用,而类别总是只扩展一个类——它们在定义中声明了这一点。

    这是关键的区别,因为这意味着这两个特性的用例完全不同。另一种看待它的方式是,如果你从Ruby到Objective-C,而错过了混搭,你将不会从分类中找到任何乐趣。

    mixin的用例是您有一些代码-方法和实例变量-您希望在几个没有公共超类的类中重用它们。你不能用类别来做这件事。

    mixin实际上是Objective-C中找不到的类型的“多重继承”。Objective-C中最接近的是协议,就像Java中最接近的是接口一样,但它们既没有实例变量,也没有实例变量 方法体 (在objective-C或java中)。因此,您通常只需要创建帮助器类或将代码放入超类。

    objective-c类别的用例是,您希望向现有类(甚至是系统或库类)添加方法。

    我想说,混合器更强大,但由于这是一个苹果对橙子的比较,这将是毫无意义的。

    准确地说:

    • 我不确定objective-c与Mixins的等价物是什么——有人知道吗?

    [更新]再多搜索一点,不,Objective-C中没有与Mixin等效的东西,但富有进取心的弗拉基米尔·米特罗维奇创建了一个库,可以有效地实现这一点。 https://github.com/vl4dimir/ObjectiveMixin

    对于是否使用它,我有两种想法:有时,如果您使用的语言不支持某些东西,那么使用它比与之抗争或尝试从其他语言导入您喜爱的功能更容易。(“如果你不能使用你喜欢的编程语言,那就去爱你正在使用的语言”)。

    再说一次,也许这只是我有点傲慢。多年来,整个面向方面的编程运动一直在向Java添加特性(但我可能要补充的是,除了JBoss之外,从未获得过太多的吸引力)。无论如何,弗拉基米尔因为在他的例子中使用忍者龟而获得额外的荣誉。

    另一方面,作为一个相对客观的noob,在我看来,我在网上找到的示例代码中过度使用了类别。将静态帮助器方法添加到具有类别的系统类中似乎是一种常见的做法,而创建一个帮助器类来在项目中容纳这些方法同样容易,在系统类更新或您导入其他人的具有自己的此类类别的库时,这些方法被破坏的风险更小。一个常见的例子是向UIColor添加新的静态颜色方法。为什么不直接将它们添加到本地类?

    我所看到的类别的一个非常好的用途是添加方法,不是添加到系统类,而是添加到 生成 上课。因此,当您从核心数据对象模型生成类时,您需要添加新的构造函数或其他方法来真正做到这一点 在模型类中,您可以使用类别执行此操作,这样,如果您更改了模型,就可以安全地重新生成模型类,而不会丢失您的工作。

    总之: -忘记将类别作为mixin的解决方案

        3
  •  4
  •   pgb    17 年前

        4
  •  2
  •   Paul Dixon    17 年前

    使用mixin,可以从基和mixin派生一个新类,然后实例化这个新类以利用它。

    对于类别,您可以有效地直接添加基类,以便该基类的所有实例都可以访问该类别提供的功能。