用过别的语言做过开发的同学都知道,如果你想扩充一个类,就应该去继承这个类。但是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,大功告成,看下运行结果

有错误或者您有更好的见解还请您多多拍砖~

[OC笔记] Category分类之见解的更多相关文章

  1. category分类

    /* 使用继承关系来扩充一个类,有一个弊病,高耦合性 category(分类,类别) 能够帮我们扩充一个类的功能 */ - (void)superJump { //    [self eat]; [s ...

  2. 如何在swift中实现oc中的分类

    在oc中为了增强已有类的功能,我们经常使用分类.使用分类,我们可以在不破坏原有类的结构的前提下,对原有类进行模块化的扩展. 但是在swift中没有分类这种写法了.相对应的是swift中只有扩展(Ext ...

  3. Objective-C中的Category(分类)

    Objective-C中的Category(分类) 1 Category概念:动态的为已经存在的类加入新的行为(方法) 2 Category(分类)创建的方法 (1)通过Xcode生成分类 (2)能够 ...

  4. iOS - OC Category 分类

    1.Category 1)分类/类别(category): 允许以模块的方式向现有类定义添加新的方法(默认不能添加实例变量).用以扩展自己或他人以前实现的类,使它适合自己的需要. 分类的名称括在类名之 ...

  5. [OC笔记] protocol之我的见解

    OC中的protocol就是和JAVA中interface差不多的东西,但是又不是完全一样的.这个protocol常用来实现委托,也就是自己不实现,当事件产生的时候去回调委托者. 让委托者去执行响应的 ...

  6. OC特有语法-分类(category)

    本文转载Keefo. Objective-C的Object-oriented programming特性提供subclass和category这2个比较非常重要的部分.subclass应该反复被各种编 ...

  7. OC category(分类)

    // ()代表着是一个分类 // ()中的Test代表着分类的名称 @interface Student (Test) // 分类只能扩展方法,不能增加成员变量 - (void)test2; @end

  8. OC笔记一:Objective-C简介

    1.OC简介 全称:Objective-C,是扩充C的面向对象编程语言,主要用于iOS和Mac OS开发. C语言的基础上,增加了一层最小的面向对象语法 完全兼容C语言 可以在OC代码中混入C语言代码 ...

  9. OC的类别(分类)和拓展

    一.分类: 1.适用范围      当你已经封装好了一个类(也可能是系统类.第三方库),不想在改动这个类了,可是随着程序功能的增加需要在类中增加一个方法,这时我们不必修改主类,只需要给你原来的类增加一 ...

随机推荐

  1. 新华龙电子推出最新网络开发板(W5100&W5500方案)

    2014/12/16 | Filed under: TCP/IP芯片 and tagged with: C8051, W5100, W5500, 新华龙电子, 网络开发板 42 Views 深圳新华龙 ...

  2. 使用Struts2搭建登录注册示例

    使用Struts2来搭建mvc网站框架还是比较容易的,Struts2提供了各项辅助功能,保证了web开发的快速方便.下面使用struts2来搭建一个登录注册示例. 0 项目结构截图 1 搭建Strut ...

  3. R语言 三个函数sort();rank();order()

    R语言入门,弄懂了几个简单的函数,分享一下:R语言排序有几个基本函数: sort():rank():order()sort()是对向量进行从小到大的排序rank()返回的是对向量中每个数值对应的秩or ...

  4. idea添加内存

    在idea安装目录下的以下两个文件: 添加内存:

  5. TabLayout 简单使用。

    先上效果图 在使用TabLayout 之前需要导入design包. 我使用的是android studio 只要在build.gradle中加入 compile 'com.android.suppor ...

  6. Dell_R710 centos5.4 网卡(BCM5709)中断故障解决

    环境:Dell R710   Centos 5.4 i386 现象:正常运行中无故断网,没有规律 原因:RedHat As5.X 版本中的Broadcom NetXtreme II BCM 5709 ...

  7. Opencv出现错误“0xc000007b”的解决办法

    装了一下午的opencv.之前用VS2010装过opencv,当时使用的是cmake编译源码的办法,这个方法好处就是不用每新建一个工程就重新链接opencv库文件.今天装了个VS2013,再装open ...

  8. jquery一些基本函数

    jquery.com1.x版本兼容ie2.x版本简化适合移动端 $('li:first') 第一个$('li:eq(2)') $('li:last') 最后一个$('li:odd') 偶数行 1 3$ ...

  9. 常用COBOL函数

    本文来自(http://refer.it-manual.com/cobol.html) COBOL関数(JIS-COBOL規格標準)の一覧表を掲載しています. COBOL関数一覧表は.各項目での並べ替 ...

  10. IPv6测试环境

    1.准备机器 三台PC机器,通过1个hub连接,1台windows,安装成双网卡,1个网卡连接外网,1个网卡连接IPv6环网.系统版本:xp sp3 for japan 2台linux机器.操作系统版 ...