何时使用类别以及何时使用子类化? [关闭]

Posted

技术标签:

【中文标题】何时使用类别以及何时使用子类化? [关闭]【英文标题】:When to use categories and when to use subclassing? [closed] 【发布时间】:2011-11-09 05:47:21 【问题描述】:

谁能告诉我在 Objective-C 中何时使用类别以及何时使用子类化?也请告诉我它们的优缺点。

【问题讨论】:

Difference between inheritance and Categories in Objective-c 的可能重复项 到目前为止,您对它们有什么了解?你想对他们做什么?是什么让您相信它们有任何关联? 【参考方案1】:

如果你想用最少的代码改变类的所有实例的行为,objective-c 类别很有用。如果您只想更改某些实例的行为,而为其他实例保留原始方法,则子类化会更有用。

类别可能很危险,尤其是当您无法查看原始方法的来源时,因此您通常应该在第三方和私有框架上使用子类,而不是使用类别。

【讨论】:

@coneybeare,我们可以说类别不会改变对象,而子类会改变对象吗?请告诉 我会反过来说。类别会更改对象实例上的可用方法,其中子类化会创建不同类型的新对象。 @coneybeare 你能解释一下类别对第三方或私有框架有多危险吗? 因为您可以覆盖或更改一个私有方法,该方法可以在您不知情的情况下随时更改。 category 的优点是我们可以将方法添加到我们没有源访问权限的现有类中。我的意思是我们可以将方法添加到标准库或私有框架中。【参考方案2】:

Category :如果我们想在给定类上添加任何来源未知的方法,则使用它。当我们想要改变任何类的行为时,这基本上会被使用。

例如:如果我们想在 NSString 上添加一个方法来反转字符串,我们可以使用类别。

子类化:如果我们想修改任何类的状态和行为,或者重写任何方法来改变父类的行为,那么我们就去子类化。

例如:我们继承 UIView 以在我们的 ios 代码中改变它的状态和行为。

【讨论】:

【参考方案3】:

补充 coneybeare 所说的话。子类化是一个更好的自定义选项,当您只想向现有类添加一些功能时,最好使用类别。

【讨论】:

【参考方案4】:

你想改变作为框架的一部分发生的事情吗 在 UI 对象的生命周期中调用?使用子类。覆盖 相应的方法,如init、drawrect、layoutsubviews等。

您想要应用程序范围内的东西吗? 除了现有的功能,你不在乎这个 对框架类的这个预先存在的实例的所有实例都可用?使用类别。示例:根据特定用户操作为 UILabel 设置动画,并在整个应用中将此动画应用于所有 UILabel 实例。

【讨论】:

感谢您的回答。我有个疑问;如果我错了,请纠正我 - 即使类别和子类可以互换使用,但你上面提到的是最佳实践。在发表此声明时,我考虑了用例 - 覆盖现有行为、添加新函数、添加变量以维护状态或任何其他属性。

以上是关于何时使用类别以及何时使用子类化? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

何时向托管对象添加类别以及何时使用瞬态属性?

何时使用类别而不是对象?

[何时在项目体系结构中使用继承? [关闭]

何时使用向量中的对象以及何时使用指向向量中对象的指针? [关闭]

使用 Java servlet 时何时打开以及何时关闭 mysql 连接?

有人可以解释一下如何以及何时应该在 oracle 中使用 syscursor 吗? [关闭]