• [转载]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预编译指令:表示必须强制实现的方法

  • 相关阅读:
    新闻发布项目——后台JSP界面adminManage/addNews.jsp
    新闻发布项目——后台JSP界面adminManage/addNews.jsp
    新闻发布项目——后台JSP界面adminManage/addNews.jsp
    新闻发布项目——后台JSP界面adminManage/adminIndex.jsp
    新闻发布项目——后台JSP界面adminManage/adminIndex.jsp
    新闻发布项目——后台JSP界面adminManage/editNews.jsp
    新闻发布项目——后台JSP界面adminManage/editNews.jsp
    新闻发布项目——后台JSP界面adminManage/adminIndex.jsp
    新闻发布项目——后台JSP界面adminManage/editNews.jsp
    新闻发布项目——后台JSP界面adminManage/manageTopic.jsp
  • 原文地址:https://www.cnblogs.com/davidzhou11225/p/2516268.html
Copyright © 2020-2023  润新知