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的文件。

  • 相关阅读:
    day 66 crm(3) 自创组件stark界面展示数据
    day 65 crm(2) admin源码解析,以及简单的仿造admin组件
    用 Python+nginx+django 打造在线家庭影院
    django -admin 源码解析
    day 64 crm项目(1) admin组件的初识别以及应用
    云链接 接口不允许 情况 解决方法 mysql Host is not allowed to connect to this MySQL server解决方法
    day 56 linux的安装python3 ,虚拟环境,mysql ,redis
    day55 linux 基础以及系统优化
    Codeforces 989 P循环节01构造 ABCD连通块构造 思维对云遮月参考系坐标轴转换
    Codeforces 990 调和级数路灯贪心暴力 DFS生成树两子树差调水 GCD树连通块暴力
  • 原文地址:https://www.cnblogs.com/dzhs/p/5377306.html
Copyright © 2011-2022 走看看