`
BradyZhu
  • 浏览: 247622 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Object-C中的协议Protocol

 
阅读更多

在写java的时候都会有接口interface这个概念,接口就是一堆方法的声明没有实现,而在OC里面,Interface是一个

类的头文件的声明,并不是真正意义上的接口的意思,在OC中,接口是由一个叫做协议的protocol来实现的。这个里面

可以声明一些方法,和java不同的是,它可以声明一些必须实现的方法和选择实现的方法。这个和java是完全不同的。

下面我们就用一个例子来说明这个吧。

首先是MyProtocol.h也就是接口的声明文件

//
//  MyProtocol.h
//  Protocol
//
//  Created by bird on 12-10-22.
//  Copyright (c) 2012年 bird. All rights reserved.
//

#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
//  Protocol
//
//  Created by bird on 12-10-22.
//  Copyright (c) 2012年 bird. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "MyProtocol.h"

@interface MyTest : NSObject <MyProtocol>

- (void) showInfo;

@end

下面就是实现文件了

//
//  MyTest.m
//  Protocol
//
//  Created by bird on 12-10-22.
//  Copyright (c) 2012年 bird. All rights reserved.
//

#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
//  Protocol
//
//  Created by bird on 12-10-18.
//  Copyright (c) 2012年 bird. All rights reserved.
//

#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:);//这个print转换成的方法
        //确定这个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;
}

[myProtocol respondsToSelector:@selector(print:)]
这句话的用处就是测试是否这个类实现了这个方法
分享到:
评论

相关推荐

    Object-C的语法与Cocoa框架

    阅读本文档,您最好有一定的C语言、JAVA语言的基础。...13. 协议@protocol 14. 内存管理 15. 常用的类型 16. 写入和读取属性 17. 对象的复制 18. 多线程 19. KVC 与KVO 20. 谓词NSPredicate

    Object-C语言教程&案例,要点难点,代码示例,代码解析

    Objective-C教程要点 ...协议与代理:理解协议(Protocol)和代理(Delegate)设计模式在Objective-C中的应用。 块与闭包:学习如何使用块(Block)实现闭包(Closure)功能。 多线程与并发:了解GCD(Grand Central Dispa

    Ice-3.7.1.rar

     RPC(Remote Procedure Call Protocol 远程过程调用协议),是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC假定某些传输协议的存在,如TCP或UDP,为通讯程序之间携带信息数据;...

    ZeroC Ice 3.7 手册

    RPC(Remote Procedure Call Protocol 远程过程调用协议),是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC假定某些传输协议的存在,如TCP或UDP,为通讯程序之间携带信息数据;在...

    java英文的笔试题-quickfast:FAST协议的C++实现

    Protocol Limited [FPL] () 开发,作为减少带宽和网络延迟的一种方式 由于 FAST 并非特定于市场数据或金融行业,因此有机会在各种情况下使用 FAST。 QuickFAST 被编写为可移植到许多平台。 它在 Windows 和 Linux 上...

    基于mediastreamer2的网络电话实现流程以及源码库

    分析:在json的论坛中,找到了解决方案:把编译生成的/lib/pkgconfig/这个目录下生成了一个json-c.pc。最后mediastreamer2在调用的时候找的是json.pc。那么我们就把这个文件名改为json.pc #mv json-c.pc json.pc OK...

    C#调用WebService实例与开发教程(推荐)

    1.1、Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的...Soap:(Simple Object Access Protocol)简单对象存取协议。是XML Web Service 的通信协议。当用户

    使用 XML-RPC 为 C++ 应用程序启用 Web 服务

    简单对象访问协议(Simple Object Access Protocol,SOAP)、代表性状态传输(Representational State Transfer,REST)以及 XML 远程过程调用协议(XML Remote Procedure Call,XML-RPC)等 Web 服务协议可帮助将...

    W3C Soap 活动

    SOAP (Simple Object Access Protocol) 是一种中立于平台和语言的轻量级通信协议,使得程序可以通过标准的因特网 HTTP 进行通信。 如需学习更多有关 SOAP 的知识,请阅读我们的 SOAP 教程。 SOAP 1.1 在 2000 年 5 ...

    asp.net面试题

    答:SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),...

    W3C教程(12):W3C Soap 活动

    SOAP (Simple Object Access Protocol) 是一种中立于平台和语言的轻量级通信协议,使得程序可以通过标准的因特网 HTTP 进行通信。 如需学习更多有关 SOAP 的知识,请阅读我们的 SOAP 教程。 SOAP 1.1 在 2000 年 5 ...

    java开源包3

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    超级有影响力霸气的Java面试题大全文档

    1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是...

    java 面试题 总结

    Inc inc=tt.new Inc(); Dec dec=tt.new Dec(); for(int i=0;i;i++){ Thread t=new Thread(inc); t.start(); t=new Thread(dec); t.start(); } } private synchronized void inc(){ j++; System.out.println(Thread....

    java开源包1

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    C#调用webservice接口的最新方法教程

    前言 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet...Soap:(Simple Object Access Protocol)简单对象存取协议。是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文

    Python使用Pickle库实现读写序列操作示例

    pickle模块实现了用于对Python对象结构进行序列化和反序列化的二进制协议。“Pickling”是将Python对象转换为字节流的过程,“unpickling”是反向操作,由此字节流二进制文件或字节对象)转换回对象结构。 模块方法 ...

    vs2019创建WebService服务的实现

    SOAP:全名为(Simple Object Access Protocol)简单对象存取协议。是XML Web Service的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他可以通过SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML 文档...

    java开源包10

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    GenericProtocol::high_voltage:一个基于TCP事件的快速缓冲服务器客户端协议,用于通过.NET中的(inter)net传输数据

    &lt;T&gt; 通用协议 :high_voltage: 一种基于TCP事件的快速缓冲服务器/客户端协议,用于通过.NET中的(互联网)网络传输数据 :globe_with_meridians:为什么? 通过网络更轻松,更快速地发送整个对象发送几乎任何.NET ...

Global site tag (gtag.js) - Google Analytics