What is "Categories"(什么是类别)
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
Categories(类别)的使用,给Objective-C中增加了很实用的功能,它可以在不修改现有类以及不定义新的子类的前提下,给现有类增加新的方法。当定义并实现了一个类别的时候,所有应用了这个类别的类的所有对象都可以调用类别中定义的新的方法了。而且应用了这个类别的类的子类也继承了类别中的新定义的方法。但是,类别不可以增加新的实例变量。目前除了Ruby以外,其他的面向对象语言都还没有类别的概念。不过我们还是非常值得去花时间搞明白Objective-C中类别的概念以及类别能给我们带来的好处。
在类的声明@interface中建立一个类别(你可以理解为在现有的类对象中建立一个新的方法组),代码如下:
#import "Point.h"
@interface Point (Transformable)
- translateByX: (float)tx Y: (float)ty;
- rotateByAngle: (float)radians;
- scaleByAmountX: (float)xscale Y: (float)yscale;
@end
上述代码中给Point类增加了一个类别Transformable,大家看到了吧,在类的声明@interface最后使用圆括号(类别名)来声明一个类别。那如何实现类别中的方法呢?代码如下:
#import "PointTransformable.h"
@implementation Point (Transformable)
- (void) translateByX: (float)tx Y: (float)ty
{
x += tx;
y += ty;
return self;
}
- (void) rotateByAngle: (float)radians
{
// ...
}
- (void) scaleByAmountX: (float)xscale Y: (float)yscale
{
// ...
}
@end
注意上面代码中类别的方法- (void) translateByX: (float)tx Y: (float)ty
是可以访问类的实例变量的。
上面那段代码就是类别的一个用处。设想一下,你正在使用一个第三方的开发包,包里面提供了一些与几何图形有关系的类比如Point类和Line类。你用这些类开发一个小的动画,你需要让这些点和线有些变化,但是这个第三方包又没有提供这样的类共你使用。你完全不用花很多时间去设计一些子类来完成这个工作,你只要给每一个几何图形的类增加一个变形的类别(Transformable category)即可。在运行时,所有这些第三方包中自带的几何图形类就都有了额外的变形功能,而且完全不影响原有第三方包中类的各种功能,相当于将这个第三方的功能得以增强了。
在线练习
{$ activeFileHint $}