如果类别如此强大,那么何时是子类化 iOS 类的合适时机?

Posted

技术标签:

【中文标题】如果类别如此强大,那么何时是子类化 iOS 类的合适时机?【英文标题】:If categories are so powerful, when is the proper time to subclass an iOS class? 【发布时间】:2015-12-27 08:49:24 【问题描述】:

类别如此强大,可以添加方法,加上associations 可以添加额外的属性和 ivars,真的很难看出 Objective C 中子类的重要性。

在开源中内置了这么多开源类别,我真的看不出子类的意义。关联还可以提供调用链(在关联属性实现内部),因此不需要继承。

当我想创建 MyLabel 扩展 UILabel 或 MyString 扩展 NSString 时,谁能提供确切的用例?

【问题讨论】:

【参考方案1】: 子类可以安全地覆盖超类中的方法;类别不能。 子类仅为新类的实例定制行为,而不是为超类的所有实例定制行为。 子类声明意图的方式是类别集合无法做到的。

【讨论】:

【参考方案2】:

如果您不想扩展现有类,则需要使用子类化。

假设您希望能够将对象映射到 JSON。如果您通过类别扩展NSObject,则意味着从NSObject 子类化的所有类都应该有一些类似映射规则的代码。这不是一个可行的方法,因为几乎所有类都是NSObject 的子类。

为避免这种情况,您必须在 NSObject 的子类中实现 JSON 映射。因此,每个人都会知道,您的子类的所有实例都提供了映射和正常工作的必要方法。

【讨论】:

【参考方案3】:

一般来说:

类别用于添加方法等,并应用于超类的所有实例...所以一切以NSString为例。 子类可以添加/覆盖(更改)部分,并且可以应用于类的特定实例,而不是 NSString 中的所有内容。

【讨论】:

以上是关于如果类别如此强大,那么何时是子类化 iOS 类的合适时机?的主要内容,如果未能解决你的问题,请参考以下文章

实例化类对象是啥意思?

iOS分类延展和子类的区别

接口和抽象类的区别

python 类 三:子类

CALayer 的子类 VS 类别

JAVA-初步认识-第九章-继承-子父类中的构造函数-子类的实例化过程-细节