zoukankan      html  css  js  c++  java
  • 协议 protocol

    协议声明类需要实现的的方法,为不同的类提供公用方法,一个类可以有多个协议,但只能有一个父类,即单继承。它类似java中的接口。

    正式协议(formal protocol)
    ------------------------------------------------------------------------------------
    声明正式协议使用@protocol指令,以@end结尾。
    @protocol MyXMLSupport
    - initFromXMLRepresentation:(NSXMLElement *)XMLElement;
    - (NSXMLElement *)XMLRepresentation;
    @end
    可以在协议声明中使用@optional和@required指令来指定协议中的方法是否必须要实现。如果没有为方法指定任何指令,@required是协议中默认的指令。
    @protocol MyProtocol
    - (void)requiredMethod;
    @optional
    - (void)anOptionalMethod;
    - (void)anotherOptionalMethod;
    @required
    - (void)anotherRequiredMethod; 
    @end

    非正式协议(informal protocol)
    ------------------------------------------------------------------------------------
    非正式协议通过分类(category)来实现,不过在Mac OS X v10.6+中可以在协议中通过@optional指令来取代这个别扭的方案。
    @interface NSObject ( MyXMLSupport )
    - initFromXMLRepresentation:(NSXMLElement *)XMLElement;
    - (NSXMLElement *)XMLRepresentation;
    @end

    协议对象(protocol objects)
    ------------------------------------------------------------------------------------
    Objective C中定义了协议对象,通过@protocol指令可以获取protocol实例。
    Protocol *myXMLSupportProtocol = @protocol(MyXMLSupport);
    当类采用(adopt)接口或在代码中通过@protocol(XX)指令时,编译器会创建protocol实例。

    协议的使用
    ------------------------------------------------------------------------------------
    协议的采用(adopt)和声明父类类似,可以在父类后面用尖括号将要采用的协议括起来,多个协议用逗号(comma)隔开。
    类和分类都可以采用协议。
    @interface ClassName : ItsSuperclass < protocol list >
    @interface ClassName ( CategoryName ) < protocol list >
    在接口部分不需要重新声明协议中的方法。但在类的实现部分需要实现协议中的@required方法。

    是否遵循某协议
    ------------------------------------------------------------------------------------
    检查一个类或实例对象是否遵循某协议可以用NSObject类的类方法conformsToProtocol和实例方法conformsToProtocol
    if ( ! [receiver conformsToProtocol:@protocol(MyXMLSupport)]  ) {
        // Object does not conform to MyXMLSupport protocol
        // If you are expecting receiver to implement methods declared in the
        //  MyXMLSupport protocol, this is probably an error
    }

    使用协议进行类型声明
    ------------------------------------------------------------------------------------
    声明对象类型时可以在声明中指定协议,这样可以让编译器在编译阶段强制对象遵循某协议。
    - (id <Formatting>)formattingService;
    id <MyXMLSupport> anObject;

    协议的继承
    ------------------------------------------------------------------------------------
    协议也可以继承或采用其他的协议,需要采用某协议的类必须实现该协议的required方法和该协议继承的协议中的required方法。
    @protocol ProtocolName < protocol list >

    在协议中使用其它的协议
    ------------------------------------------------------------------------------------
    在一个大型的应用中,你可能会遇到如下代码:
    #import "B.h"
    @protocol A
    - foo:(id <B>)anObject;
    @end

    #import "A.h"
    @protocol B
    - bar:(id <A>)anObject;
    @end

    A、B协议在互相引用,如果这里都用import来引入协议文件,编译器会报错。需要改为如下方式:
    @protocol B;
    @protocol A
    - foo:(id <B>)anObject;
    @end
    @protocol B只是简单告诉编译器B是一个协议,不会引入B的文件。

  • 相关阅读:
    关于cnblogs 的KJC模板个性化定制
    2004手机游戏年终点评
    原创作品:手机泡泡堂 1.0 下载
    KillZone2杀戮地带2 超清晰展示
    常用编码工具类,支持base64,md5,des,crc32
    缩小数据库日志的工具源码
    制作了一个WMI 查询分析工具
    常用排序工具类:标准【正序、倒序】排序算法‘冒泡排序,选择排序,快速排序’
    用C#设计一个驱动备份的程序代码
    今天家里停电……
  • 原文地址:https://www.cnblogs.com/dzhs/p/5377306.html
Copyright © 2011-2022 走看看