【OC】六、分类和协议

分类(category)

    什么是分类?分类提供了一种简单的方式,用它可以将类的定义模块化到相关方法的组或分类中,他还提供了扩展现有类定义的简便方法,并且不必访问类的原代码,也不需要创建子类

    定义上面讲完了,通俗的说个例子:

        比如我们现在有一个Fraction类 我们想在Fraction中添加个方法,但是我们又不想修改Fraction的代码  这时候 我们就可以使用分类了

下面看下代码:

    我们创建了一个Fraction类 里面有一个add方法

@interface Fraction : NSObject

-(void)add;

@end

@implementation Fraction

-(void)add{
    NSLog(@"--->add");
}

@end

    这时候 我们想在这基础上添加一个print方法  以前  我们可以直接在代码中写,不过现在我们用分类来写

@interface Fraction (Other)

-(void)print;

@end

@implementation Fraction (Other)

-(void)print{
    NSLog(@"--->print");
}

        在main中执行下

 Fraction* mFraction = [[Fraction alloc] init];
 [mFraction print];

创建分类的格式:

@interface 原类名 (分类名)

@end

@implementation 原类名(分类名)

@end

一般  我们可以把分类的接口部分的文件名命名为 FractionOther. 实现部分命名为FractionOther.m

不过 有些程序猿会使用『+』来分隔类和分类的名字 比如 Fraction+Other.h

类的扩展

    创建一个未命名的分类,且在括号之间不指定名字,这是一个特殊情况,这种特殊的语法定义为 类的扩展

    需要在主实现区域实现,不能在分离的实现区域中实现

协议和代理

    协议(protocol)是Objective-c中一个非常重要的语言特性,从概念上讲,非常类似于JAVA中接口. 一个协议其实就是一系列有关联的方法的集合(为方便后面叙述,我们把这个协议命名为myProtocol)。协议中的方法并不是由协议本身去实现,相反而是由遵循这个协议的其他类来实现。换句话说,协议myProtocol只是完成对协议函数的声明而并不管这些协议函数的具体实现。

    如何定义?

    使用@protocol指令,后面跟行协议名,然后申明一些方法  最后以@end结束

    @protocol ProrocolName

    -(void)print;

    @end

    如果需要才用协议,则必须实现协议中的方法,通过在@interface行的一对尖括号内列出协议名

    使用语句:

    @interface ClassName : parentClassName <protocolName>

    如果需要实现多个协议,可以用逗号分开

 @interface ClassName : parentClassName <protocolName, protocolName2>

    然后  在协议中声明的方法  我们都要在需要实现协议的类中实现方法

    如果不一定要实现方法 需要使用@optional指令

比如下面的代码

@protocol ProtocolName
-(void)write;
@optional
-(void)print;
@end

    上面的代码中print方法就不一定要实现

    如果接下去还有需要实现的方法  可以使用@required指令

------->

委托代理(delegate

       委托代理(degegate),顾名思义,把某个对象要做的事情委托给别的对象去做。那么别的对象就是这个对象的代理,代替它来打理要做的事。反映到程序中,首先要明确一个对象的委托方是哪个对象,委托所做的内容是什么。 
       委托机制是一种设计模式,在很多语言中都用到的,这只是个通用的思想,网上会有很多关于这方面的介绍。那么在苹果开发过程中,用到委托的程序实现思想如下,我主要拿如何在视图之间传输信息做个例子。 
譬如:在两个页面(UIIview视图对象)实现传值,用委托(delegate)可以很好做到! 

        


你可能感兴趣的:(【OC】六、分类和协议)