用过别的语言做过开发的同学都知道,如果你想扩充一个类,就应该去继承这个类。但是OC里面有更好的方法,那就是分类。
那什么是分类呢?就是在不改变原先类,我们可以在其中添加咱们自定义的方法,这样和同事合作的时候,就用不着担心合并
代码产生的冲突了~因为我们可以定义属于自己的分类。但是使用分类的时候却不能向原先类中添加字段,如果想添加方法,那
应该使用继承来实现。
话不多说,我们直接上代码,我前几篇日志中提到一个student类,里面的方法是在是太单调了,只有一个keepBook的方法,现在
我需要让他支持一个动作:"阅读书本"。但是我又不想更改这段Student代码。这时,我就使用分类了
1.新建Student+Read.h和Student+Read.m文件,构成咱们的分类
2.开始写代码~
头文件中代码如下,我给这个分类中添加一个方法
#import "Student.h" @interface Student (Read) -(void)readBook; @end
实现文件代码如下
#import "Student+Read.h" @implementation Student (Read) -(void)readBook{
//因为咱们的Book已经声明好了description方法
//所以咱们直接用%@就可以答应书本的内容了
//不清楚的同学可以看下上篇博客
NSLog(@"书本的内容是>>>>%@",[self mBook]);
}
@end
这样,咱么就已经成功的给student这个类扩充了一个readBook这个方法了
3.接下来咱们就应该去调用这个新的student了
因为我们要使用的是扩展的这个Student对象,所以咱们应该import"Student+Read.h"这个头文件
看代码:
#import <Foundation/Foundation.h>
//导入book和student的声明
#import "Book.h"
//#import "Student.h"
#import "Student+Read.h"
//这是一个简单的宏,java写多了,各位理解万岁
#define ptr_(m) *(m) int main(int argc, const char * argv[])
{ @autoreleasepool {
//先创建一个Book对象
Book ptr_(mBook)=[[Book alloc]initWithPages: andContents:@"我是内容"];
//创建一个Student对象
Student ptr_(mStudent) =[[Student alloc]initWithId:];
//让学生持有一本书
[mStudent keepBook:mBook];
//调用这个扩充过的读书代码
[mStudent readBook];
//释放书籍对象
[mBook release];
//释放学生对象
[mStudent release];
}
return ;
}
OK,大功告成,看下运行结果
有错误或者您有更好的见解还请您多多拍砖~