Objective c 何时使用类别

Objective c 何时使用类别,objective-c,Objective C,我最近发现了类别,想知道什么时候在用户定义的类/新类中使用它们是合适的。例如,我可以看到将类别添加到现有类(如NSString)的好处,但在创建新类时,将类别添加到该类而不仅仅是实现普通方法的好处是什么 希望这是有意义的。 非常感谢 Jules如果我正确理解了你的问题,那么创建一个“新类”总是“子类化”,因为你至少在子类化NSObject 您可以在新类上使用类别来分隔复杂类的职责部分。例如,所有基本功能(实例变量、访问器、描述等)都可以放在一个文件(“主”类文件)中,而支持协议的所有方法(如NS

我最近发现了类别,想知道什么时候在用户定义的类/新类中使用它们是合适的。例如,我可以看到将类别添加到现有类(如NSString)的好处,但在创建新类时,将类别添加到该类而不仅仅是实现普通方法的好处是什么

希望这是有意义的。 非常感谢


Jules

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

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


有些人采取这种方法来保持事物“整洁”。我坚信“如果它是我自己的自定义类,那么它的所有代码都应该在一个文件中”,所以我个人不会这么做。我用“#pragma标记某些节名”来划分类代码的不同逻辑方面,以帮助导航和可读性。您的里程数可能会有所不同。

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


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

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

在Martin Fowler的《重构》一书中,他有一节题为“引入外部方法”(你正在使用的服务器类需要一个额外的方法,但你不能修改该类)。这就是类别的好处所在


也就是说,有时使用类别而不是更改类别是合适的。关于使用类别的一个很好的例子是,即使您可以更改服务器类,苹果是如何处理的。他们本可以将这两种方法放在UIViewController本身中,但由于唯一会使用它们的人是使用Media Player框架的人,因此将这些方法保留在那里更有意义。

就个人而言,我强烈反对使用类别来懒散地扩展标准类。使第三方更难理解源代码,因为他们不希望在标准类中使用非标准方法。是的,我知道它在与NSString之类的类一起使用时很有用。我的问题更多的是关于他们什么时候对我写的一个类有用,比如一个人类。我们可以删除前面添加的一个类别吗?直到-很好的一点,尽管如果代码永远看不到,那么使用它应该很好?raj2razz-我认为如果类别只使用一次,那么在类中有一个需要它的方法就更有意义了?好吧,我想这是有意义的。虽然我想我会采取和你一样的方法。因此,据我所知,当与现有类(即NSString)一起使用时,就Im而言,类别的主要优势是,+1表示“可以在新类上使用类别来分离复杂类的责任部分。”以及协议场景。好主意。我希望看到更深入的讨论“新类上的类别以分离复杂类的责任部分”与“#pragma标记某些部分名称”。可能重复