问题 何时使用类别


我最近发现了类别,并且想知道何时在用户定义的类/新类中使用它们是合适的。例如,我可以看到将类别添加到现有类(如NSString)的好处,但是在创建新类时,为此添加类别的优势是什么,而不仅仅是实现常规方法?

希望这是有道理的。 非常感谢

儒勒


12875
2018-04-13 11:22


起源

可能重复 Objective-c中继承和类别之间的区别 - Black Frog


答案:


对于您自己的类,答案与框架类没有任何不同。如果您有多个项目,您可能最终会在它们之间共享一些类。但是,您可能希望扩展一些类,以便它们可以更轻松地使用特定项目,但不希望在其他项目中包含这些额外的方法,这些方法可能没有意义。您可以使用类别来扩展您的类,而无需子类。


8
2018-04-13 11:42



谢谢,这有很多帮助。 - Jules


如果我正确理解你的问题,创建一个“新类”总是“子类”,因为你至少是NSObject的子类。

您可以在新类上使用类别来分离复杂类的责任部分。例如,所有基本功能(实例变量,访问器,描述等)都可以放在一个文件(“主”类文件)中,而支持协议的所有方法(如NSTableViewDataSource)可以放在另一个文件中。

有些人采取这种方法来保持“整洁”。我坚信“如果它是我自己的自定义类,它的所有代码都应该在一个文件中”,所以我个人并不这样做。我使用“#pragma mark Some Section Name”来划分类代码的不同逻辑方面,以帮助导航和可读性。你的旅费可能会改变。


6
2018-04-13 11:29



好吧,我认为这是有道理的。虽然我认为我倾向于采取与你相同的方法。因此,根据我的理解,就我所关注的类别而言,当与现有类(即NSString)一起使用时,类别的主要优点。 - Jules
你说对了。 :-) - Joshua Nozzi
+1表示“您可以在新类别上使用类别来分离复杂类别的责任部分。”和协议方案。很好的想法。 - Philip007
我想更深入地讨论“新类别的类别,以分离复杂类的责任部分”与“#pragma mark some Section Name”。 - Stian Høiland


当您想要调用方法时,在NSString上添加类别非常有用 每一个 您将遇到的NSString实例。这是对这种对象的继承的真正改进,因为它们被核心框架使用,并且当您想要调用自定义方法时,您不必将NSString对象转换为子类。

另一方面,您可以只放入方法,而不是实例变量。


1
2018-04-13 11:30



就个人而言,我是使用类别进行标准类延迟扩展的强敌。因为他们不期望标准类中的非标准方法,所以使第三方更难理解这些来源。 - Till
是的我知道它与NSString等类一起使用时很有用。我的问题更多的是关于它们何时对我编写的类(即Person类)有用。 - Jules
+1如果我们不想在其他地方使用某些内容,该怎么办?我们可以删除之前添加的类别吗? - SNR
直到 - 好点,虽然如果代码永远不会被看到它应该没问题? - Jules
raj2razz-我认为如果只使用一次类别那么在类中有一个需要它的方法更有意义吗? - Jules


在书里 重构 作者:Martin Fowler,他有一个标题为“引入外来方法”的部分(您正在使用的服务器类需要一个额外的方法,但您无法修改该类。)这是什么类别的好处。

也就是说,有时候使用类别而不是改变类是合适的。即使您可以更改服务器类,使用类别的一个很好的例子就是Apple处理它的方式 UIViewController MediaPlayer Additions。他们可以将这两个方法放在UIViewController本身,但由于只使用它们的人是使用Media Player框架的人,因此将方法保留在那里更有意义。


0
2018-04-13 11:48