IOS Protocol与Delegate详解(一)

来源:互联网 发布:淘宝消保30元加入条件 编辑:程序博客网 时间:2024/06/17 03:45

  我所认为的Protocol(协议)是类似于java中的接口这一概念的,所谓协议,可以理解成一个类所具有的方法的特征集合,协议也属于面向对象的一部分,使用它,可以弥补类的不能多继承缺点,继承和协议的双重设计既保持了类的数据安全也变相实现了多继承


  这里的Protocol(协议,也算是java的接口),我始终认为其大致可以分为两种情况: 1.调用协议  2.回调协议(委托)

  

  调用协议

 我们在学习语言的课本中,比如在学习Protocol,课本上会给出这样的例子: 

  我们知道鸟都会飞,那么我们假定会飞的都是鸟,所以,我们可以定义一个包含fly方法的Protocol,名字叫BirdProtocol,这样,只要实现了BirdProtocol这个协议的类,都是属于鸟类的,然后我们就可以调用实现了这个协议的鸟类

   比如说我们新建了一个啄木鸟类,它肯定有一个eatWorn(吃虫)这个方法,然后再让其实现BirdProtocol协议还有里面的方法,则啄木鸟类就是一个名正言顺的"鸟"类了

   然后在定义一个鹦鹉,它有一个speak方法,在实现BirdProtocol协议还有里面的方法,则其也是一个"鸟"类

   

   说了这么多,可能有人要问,好像这个Protocol并没有什么作用吧,我新建一个啄木鸟类,实现eatWorn与fly方法,新建一个鹦鹉类,实现speak与fly方法,不一样吗?疑问

 

   其实并不是这样,协议这个概念之所以非常重要,肯定是有他的道理,就拿上述例子来说,新建两个类并实现相同的Protocol后,好处就是: 

   1.可以规范类的行为,比如新建啄木鸟这个类得时候,将鸟飞的方法写成flyInTheSky,鹦鹉写成fly方法,这会给后期维护带来很大的压力,

   2.(最重要得)可以用来向上转型  比如说我们可以创建一个鸟类的引用A,然后实例化一个啄木鸟的对象,让A指向啄木鸟,创建一个鸟类的引用B,然后实例化一个鹦鹉的对象,让B指向鹦鹉,这样做得好处是能让实现相同接口的类得到统一化的管理与使用

  

  下面上代码:

   首先是鸟类这个协议 (需要注意的是,可以看见,fly方法前面有一个@required标志,标记着这个实现此协议的类必须实现此方法,如果想要可以不实现此方法的话,可以在方法前面加上@optional标记。协议中方法默认标记是@required。如果一个类实现了一个协议,但未实现全部此协议的带有@required的方法,系统会弹出警告)


</pre><pre name="code" class="objc">#import <Foundation/Foundation.h></span>/**  鸟类的协议  */@protocol BridProtocol <NSObject>@required -(void) fly;@end

可以看出,有一个必须实现的fly方法

下面是啄木鸟类  .n文件:

#import <Foundation/Foundation.h>#import "BridProtocol.h"/**  啄木鸟类  实现了鸟类这个协议  */@interface WoodPecker : NSObject<BridProtocol>@end

.m文件:

#import "WoodPecker.h"@implementation WoodPecker-(void) eatWorn{        NSLog(@"我是啄木鸟,我在吃虫");    }-(void) fly{        NSLog(@"我是啄木鸟,在天上飞");    }@end

鹦鹉类的.h文件:

#import <Foundation/Foundation.h>#import "BridProtocol.h"/**  鹦鹉类  实现了鸟类的协议  */@interface Parrot : NSObject<BridProtocol>@end


.m文件;

#import "Parrot.h"@implementation Parrot-(void) speak{        NSLog(@"我是鹦鹉,我在说话");    }-(void) fly{        NSLog(@"我是鹦鹉,我在飞");}@end


 main.m文件中;

#import <Foundation/Foundation.h>#import "WoodPecker.h"#import "Parrot.h"#import "BridProtocol.h"int main(int argc, const char * argv[]) {    @autoreleasepool {        WoodPecker *pecker = [[WoodPecker alloc] init];                //创建一个鸟类的引用,指向啄木鸟对象        id<BridProtocol> birdA = pecker;                [birdA fly];                Parrot *parrot = [[Parrot alloc]init];                //创建一个鸟类的引用,指向鹦鹉对象        id<BridProtocol> bridB = parrot;            [bridB fly];                            }    return 0;}


 执行结果:

我是啄木鸟,在天上飞
我是鹦鹉,我在飞


 哈哈,书上大致讲的就是这样,这样使用协议可以弥补类的不能多继承缺点,但我们在实际项目中,使用这样的机会不是很多,而是用协议最广泛的方面,及时回调协议,也就是我们所说的委托

  第一节就先说到这,下一节说的是最重要的Delegate

  链接为   IOS Protocol与Delegate详解(二)

 

  

 

   

0 0
原创粉丝点击