OC中得Protocol

在写java的时候都会有接口interface这个概念,接口就是一堆方法的声明没有实现,而在OC里面,Interface是一个类的头文件的声明,并不是真正意义上的接口的意思。

在OC中,接口是由一个叫做协议的protocol来实现的。这个里面可以声明一些方法,和java不同的是,它可以声明一些必须实现的方法和选择实现的方法。这个和java是完全不同的。

下面我们就用一个例子来说明这个吧。
首先是MyProtocol.h也就是接口的声明文件 
 MyProtocol.h  
    #import <Foundation/Foundation.h>   
    @protocol MyProtocol <NSObject>  
    @optional  
    //这个方法是可选的  
    - (void) print:(int) value;  
    @required  
    //这个方法是必须实现的  
    - (int) printValue:(int) value1 andValue:(int) value2;   
    @end  

然后是Mytest.h也就是类的声明文件,这个类讲实现这个接口

MyTest.h  
    #import <Foundation/Foundation.h>  
    #import "MyProtocol.h"  
    @interface MyTest : NSObject <MyProtocol>   
    - (void) showInfo;   
    @end  


下面就是实现文件了
MyTest.m  
    #import "MyTest.h"  
    @implementation MyTest  
    - (void) showInfo  
    {  
        NSLog(@"show info is calling");  
    }   
    - (int) printValue:(int)value1 andValue:(int)value2  
    {  
        NSLog(@"print info that value1 is %d and value2 is %d",value1,value2);  
        return 0;  
    }  
    //下面的这个方法可以实现也可以不实现  
    - (void) print:(int)value  
    {  
        NSLog(@"print is value is %d",value);  
    }  
    @end  


这样我们就可以看出了,这个类实现了接口也就是协议的声明的方法,然后还定义了自己的类方法。

下面我们来看一下主函数来使用这个接口,我将分别使用两种方式来使用这个类,一个是基本的方法就是使用类的创
建来调用,另一个就是使用接口来调用
main.m   
#import <Foundation/Foundation.h>  
#import "MyTest.h"  
#import "MyProtocol.h"   
int main(int argc, const char * argv[])  
{  
    @autoreleasepool {    
        //这里是普通的类的调用方法  
        MyTest * myTest = [[MyTest alloc] init];  
        [myTest showInfo];  
          
        SEL sel = @selector(print:); 
        //可选回调,先判断是否这个类实现了这个方法,再调用  
        if([myTest respondsToSelector:sel]){  
                [myTest print:20];  
        }  
          
      
        [myTest printValue:25 andValue:15];  
        [myTest release];  
          
        //下面的方法使用协议的方式来调用  
        id<MyProtocol> myProtocol = [[MyTest alloc] init];  
        if([myProtocol respondsToSelector:@selector(print:)]){  
            [myProtocol print:210];  
        }  
          
        [myProtocol release];  
    }  
    return 0;  
}  

总结:

1.Protocol:就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写实现。
2.只要某个类遵守了这个协议,就拥有了这个协议中的所有方法声明。
3.只要父类遵守了某个协议,那么子类也遵守。
4.Protocol声明的方法可以让任何类去实现,protocol就是协议。
5.OC不能继承多个类(单继承)但是能够遵守多个协议。继承(:),遵守协议(< >)
6.基协议:<NSObject>是基协议,是最根本最基本的协议,其中声明了很多最基本的方法。
7.协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明。

补充:

1.协议的定义
    @protocol 协议名称 <NSObject>
    //方法声明列表
    @end;
2.如何遵守协议
(1)类遵守协议
    @protocol 类名:父类名 <协议名称1,协议名称2>
    @end
(2)协议遵守协议
    @protocol 协议名称 <其他协议名称>
    @end;
3.协议方法声明中的关键字
    (1)required (默认)要求实现,若没有实现则警告但不报错
    (2)Optional 不要求实现
4.定义变量时遵守协议的限制
    类名<协议名称> *变量名    NSObject<.Myprotocol> *obj;
    Id  <协议名称>  变量名   id  <.Myprotocol> obj1; 
5.Property中声明的属性也可以做遵守协议的限制
    @property (nonatomic ,strong ) 类名<协议名称> *属性名;
    @property (nonatomic ,strong ) id<协议名称>  属性名;
6.补充知识:协议本身写在.h头文件中,但也可以定义在任何地方。当这个协议只有这个类使用遵守时,一般把协议写在这个类里边,当这个协议需要多个类去实现时,就写在外边单独的文件中。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值