zoukankan      html  css  js  c++  java
  • [转载]category与protocol(ObjectC 的非正式协议和正式协议)

    本文是用于学习笔记,原文来自于 http://blog.csdn.net/dong_007_007/article/details/7490419

    着两个都是mac下的协议,用法有点像C++的函数重载和虚函数。

    1、Category:

      Category被称为"非正式协议(informal)",可以给原有的类增加新的方法,而不需要重新建一个类,然后在原有的类的基础上使用这个方法,但是不能给类增加新的数据成员。

      eg: 给NSArray增加DeepCopy的方法

      声明:

    @interface NSArray(DeepCopy)
    
    -(NSArray* ) deepCopy;
    
    @end

    实现:

    @implementation NSArray(DeeepCopy)
    
    -(NSArray* ) deepCopy
    {
        //.....
    }
    
    @end

    这样,我们可以在这个给NSArray增加协议的类中使用NSArray的新方法 deepCopy

      NSArray* array = [[NSArray alloc] deepCopy];

    可以给一个类中添加多个Category:

    @interface NSArray(deepCopy_1)
    ...
    @end
    
    
    @interface NSArray(deepCopy_2)
    ...
    @end
    
    ......

    每一个Category都有一个自己新增的方法,但是需要你自己去实现该方法的功能。

    Category的使用原则:

    1)不能增加数据成员

    2)若Category添加的方法与原有的类的方法相同,则原有的方法将被覆盖。


    2、protocol:

    protocol被称为"正式协议(formal)",与Category不同的是,如果使用了一个protocol,就要实现该协议的所有方法(protocol的方法默认情况下都是申明为@required--必须实现,也可以申明为@optional--自定义的,可实现可不实现)。

    protocol协议相当于C++中父类定义的纯虚函数,子类必须实现这些纯虚函数。但是protocol机制不需要继承,只需要声明某个协议,再实现它。

    @protocol MouseHandleProtocol
    
    -(void)mouseDown:(int)id;   //未申明类型,则默认为@required类型
    @optional
    
    -(void)mouseDrag:(int)id;  //申明为optional类型的,则可以选择实现,也可以不实现
        ......
    @end

    而后在你的类中使用这个protocol

    @interface pen:NSObject<MouseHandleProtocol>   //申明使用MouseHandleProtocol协议
    {
         ......
    }
     .....
    - (void)mouseDown:(int)id;   //必须实现
     - (void)mouseDrag:(int)id;   
    
    @end
    @implementation pen
    - (void)mouseDown:(int)id
    {
        ......
    }
    ......
    @end

     protocol使用原则:

    1).协议声明了可以被任何类实现的方法
    2).协议不是类,它是定义了一个其他对象可以实现的接口
    3).如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议。
    4).协议经常用来实现委托对象。一个委托对象是一种用来协同或者代表其他对象的特殊对象。
    5).委托,就是调用自己定义方法,别的类来实现。
    6).新特性说明
      @optional预编译指令:表示可以选择实现的方法
      @required预编译指令:表示必须强制实现的方法

  • 相关阅读:
    mac系统怎么给文件夹加密?mac文件夹加密教程
    android 代码优化:关闭输出日志
    mac下安装eclipse+CDT
    Android JNI MAC OS环境配置
    在mac下设置环境变量
    build_native.py文件分析(2)
    使Android 自带SDK 完美支持HTML5 之 html5webview
    WebView基本使用
    android EditText如何使光标随着输入内容移动
    mac下增加eclipse内存
  • 原文地址:https://www.cnblogs.com/davidzhou11225/p/2516268.html
Copyright © 2011-2022 走看看