分类和协议
一、分类
有时候在处理类定义的时候,可能想要为其添加一些新方法,但是由不想通过新建很多子类来继承并且增加新方法,这个时候分类就有了用处。相当于在使用的时候只要注明是哪个分类。
下面用例子来说明:
#import "Fraction.h"
@interface Fraction (tests)
-(void)printftest;
@end
/*
这部分声明了Fraction类的一个分类,名字叫test,增加了一个方法。
*/
@implementation Fraction(tests)
-(void)printftest
{
NSLog(@"this is a fenlei");
}
@end
/*
这里实现了分类新增的方法
*/
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Fraction *my = [[Fraction alloc]init];
[my setNum:1];
[my print];
[my printftest];
// insert code here...
NSLog(@"Hello, World!");
[pool drain];
return 0;
}
/*
这里通过主函数的调用简单地演示了怎么使用分类
*/
注意点
1、 尽管分类可以访问原始类的实例变量,但是它不能添加自身的任何变量,如果要添加自身的变量那么需要的是考虑创建子类;
2、 分类可以重载类中的一个方法,但是这是一种拙劣的设计习惯,其一,重载了一个方法以后就不能访问原来的方法,就要把原先的方法的功能全部赋值到信的方法中,如果创建了子类,那么就可以用super的方法来调用父类的方法;
3、 通过使用分类扩展这个类不仅对这个类有影响,对他的所有的子类也有影响。
4、 和接口不同的是,分类不必实现所有的方法,可以日后再去实现。
二、协议
协议是多个类共享的一个方法列表。协议中列出的方法没有相应的实现,协议提供一种方式来使用制定的名称定义一组多少有点相关的方法,常有文档说明,从而在自己定义的类中来实现他们。
@protocol +协议名
定义协议的方法
可选择是否实现的方法
@required+需要实现的方法
@end
在定义类的时候使用:(注意对于分类也可以使用)
@interface Fraction :NSObject <协议>
实现
@end
具体的协议的使用在iphone开发中总结。