我最近发现了类别,并且想知道何时在用户定义的类/新类中使用它们是合适的。例如,我可以看到将类别添加到现有类(如NSString)的好处,但是在创建新类时,为此添加类别的优势是什么,而不仅仅是实现常规方法?
希望这是有道理的。 非常感谢
朱
答案 0 :(得分:8)
对于您自己的类,答案与框架类没有任何不同。如果您有多个项目,您可能最终会在它们之间共享一些类。但是,您可能希望扩展一些类,以便它们可以更轻松地使用特定项目,但不希望在其他项目中包含这些额外方法,这些方法可能没有意义。您可以使用类别来扩展您的类,而无需子类化。
答案 1 :(得分:6)
如果我理解你的问题,创建一个“新类”总是“子类”,因为你至少是NSObject的子类。
您可以在新类上使用类别来分离复杂类的责任部分。例如,所有基本功能(实例变量,访问器,描述等)都可以放在一个文件(“主”类文件)中,而支持协议的所有方法(如NSTableViewDataSource)可以放在另一个文件中。
有些人采用这种方法来保持“整洁”。我坚信“如果它是我自己的自定义类,它的所有代码应该在一个文件中”,所以我个人不这样做。我使用“#pragma mark Some Section Name”来划分类代码的不同逻辑方面,以帮助导航和可读性。您的里程可能会有所不同。
答案 2 :(得分:1)
如果要在上遇到的每个 NSString实例上调用方法,在NSString上添加类别非常有用。这是对这种对象的继承的真正改进,因为它们被核心框架使用,并且当您想要调用自定义方法时,您不必将NSString对象转换为子类。
另一方面,你可以放入方法,没有实例变量。
答案 3 :(得分:0)
在Martin Fowler所着的 Refactoring 一书中,他有一个标题为“引入外来方法”的部分(您正在使用的服务器类需要一个额外的方法,但您无法修改该类。)这是什么类别的好处。
也就是说,有时候使用类别而不是改变类是合适的。即使您可以更改服务器类,使用类别的一个很好的示例是Apple处理UIViewController MediaPlayer Additions的方式。他们可以把这两个方法放在UIViewController本身,但由于只使用它们的人是使用Media Player框架的人,所以将方法保留在那里更有意义。