【问题标题】:Why would you use categories over subclasses?为什么要使用类别而不是子类?
【发布时间】:2015-01-18 14:50:38
【问题描述】:

我只是想弄清楚类别与子类相比的优势......我确实了解它们是如何实现的,但我目前看到的唯一优势是,它可以让您免于重构整个代码,如果你想在后期扩展一个使用过的类,这通常不应该发生在一个好的计划中。否则,作为子类实现大约需要相同的时间,并且它并没有真正带来不同的功能。因此,就我对子类与类别的了解而言,我看不出使用类别的理由。有人可以洗我的头并解释类别存在的原因吗?我会非常感谢:)

【问题讨论】:

标签: objective-c subclassing objective-c-category


【解决方案1】:

您专注于您创建的对象,在这种情况下,子类化很好。但是如果你调用一些返回一些标准对象的 Cocoa 方法呢?您是否希望每次都必须创建子类的新实例才能使用新方法?不,能够创建通过类别添加到现有类的方法要方便得多。

此外,您可能希望您的新方法不仅可用于基类,还可以用于其所有子类(例如,如果您将扩展名添加到 NSString,它也可用于 NSMutableString 实例)。

有关详细信息,请参阅Objective-C 编程指南中Customizing Existing Classes 中的讨论。

【讨论】:

  • 我认为这可能已经翻转了我大脑中的开关 :) 与子类化相比,您的两个论点确实显示出明显的优势。谢谢
【解决方案2】:

一个主要区别是类别不能添加实例变量,子类可以。

此外,还有一些类很难子类化,例如NSString,请参阅子类化说明。下面是一段摘录:“可能子类化 NSString(和 NSMutableString),但是这样做需要为字符串(不被子类继承)提供存储设施,并且实现两种原始方法。”只要你看到你就知道这并不容易。

【讨论】:

    【解决方案3】:

    尝试向 NSString 类添加一个新方法。尝试通过继承 NSString 并添加一个类别来实现。其中一个需要两分钟,另一个你永远无法正常工作。这将回答你的问题。

    【讨论】:

      猜你喜欢
      • 2010-11-18
      • 2013-11-23
      • 1970-01-01
      • 2011-07-24
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      相关资源
      最近更新 更多