类别的使用
类别的使用有如下几种方式:
● 扩展由别人实现的类
例如,我们可以通过类别来为Cocoa框架中的类增加新的方法。这些新增加的方法会被这个类的所有派生类继承,在运行时和原有的方法是没有任何区别的。
● 作为派生类的一种代替方式
和通过派生的方式来为类增加方法的方式相比,采用类别的方式来为类增加新的方法显得更加直接。例如,我们可以通过类别的方式来为NSArray或者其他的Cocoa类增加方法。和继承一样,通过类别的方式为类增加新的方法也不需要既存类的源代码。
● 以多个文件的方式来发布一个新类
例如,假如类中有很多的方法,那么我们可以对这些方法进行分组,然后根据分组结果在多个类别中进行实现。这种实现方式对整个开发过程可以带来如下的好处:
■ 提供了一种非常简便的把相关方法进行分组的方式。甚至是不同类中的相似的方法都可以放置在同一个源文件中。
■ 当有多个开发者共同开发一个较大的类的时候,扩展机制则可以极大地简化对这个类的管理。
■ 可以获得对较复杂的类的增加式、递进式的开发
■ 可以方便我们查阅需要经常使用的那些方法
■ 使得可以对类进行配置以便适应不同应用程序,而不用维护多个不同版本的源码
● 声明非正式的协议
更多信息参见“声明由别人来实现的接口”中的“非正式的协议”小节。
尽管现在的Objective-C语言支持在类别中对类继承而来的方法进行重写(overloading),甚至是对在类的接口中声明的方法进行重写,但是这种做法是被强烈地不提倡的。因为类别不是派生类的替代品,这样做有着非常不好的地方:
● 当在类别中重写继承而来的方法时,类别是可以通过向super发送消息来调用从父类中继承而来的实现的。但是,如果在类别中对其类中既存的的方法进行重写,那么该类中原有的实现是没有办法被调用到的。
● 类别不能可靠地重写其类中别的类别中的方法。 由于很多的Cocoa类中都是用到了类别,因此这点显得尤为重要。框架由于框架类中的定义的方法很有可能是类别中的方法,如果对这些方法进行重写,那么优先调用哪个类别中的方法呢?这点Objective-C中并没有定义。
● 某些方法的修改可能导致整个框架行为的变化。例如,如果我们为NSObject类增加一个windowWillClose:方法的实现,这将导致所有窗体的委托对象都会相应这个方法,并且很可能修改所有NSWindow实例的行为。这将导致可怕的行为变化,甚至可以导致程序崩溃。