zoukankan      html  css  js  c++  java
  • 类目,延展,协议

    一 类目

        类目:也称为类别,分类,用于扩展现有类,为其添加新的方法,不可以添加成员变量。

        注意:新添加的方法与原有方法同级,可以被继承;

               可以为同一类添加多个类目,但类目名和方法名不能重复,不要随意重写类中的方法;

        案例:

            //为NSString添加一个sayHello方法

            #import "NSString+SayHello.h"

            @implementation NSString (SayHello)

             //实现方法

           -(void)sayHello

            {

                NSLog(@"大家好,我是开发者");

            }

           在main中:

           

           结果为:大家好,我是开发者

           //在同一个NSString+SayHello.h文件下 为

              NSMutableString写一个拼接方法

            

             然后实现他:

                  

            main函数实现:

            

             结果为: mycopystring

            //为NSMutableArray添加一个倒序方法

            

            实现:

             

            main函数实现:

                       

            结果:

            

           类目可以访问其继承的类的实例变量,类目的方法具有最高级的优先级,即它会覆盖掉原来类中相同名字的方法;

           类目的局限性:

           类目只能给已有的类添加方法,无法添加实例变量,类目没有位置容纳实例变量。

           此时可以通过字典类型的参数解决。

           如果类目中的方法和已有类中的方法名称冲突时,类目中的方法优先级要高。

           即调用这个方法时,类目中的方法会覆盖掉原来类中的方法,为了避免这种情况发生,类目中的方法名不要和原来类

           中的方法名字相同。

    二 延展

        延展:为类添加私有方法

        案例:

        在Student.h文件中

         

         在Student.m文件中实现

         

         

         在main函数中:

         

    总结:

          类目和延展的区别:类目(category)和延展(extension)的不同在于后者可以添加属性,另外后者添加的方法必须要实现

          延展可以认为是一个私有的类目。

    三 协议

        在Objective-C中,一个类可以实现多个协议,通过协议可以弥补单继承的缺陷。但是协议跟继承不同,协议只是一个方    法列表,方法的实现得靠遵循该协议的类去完成。

        协议的声明和类的声明类似,不过协议的声明是用@protocol声明的一组方法列表。

        列表中的方法是由其他的类去实现,相当于类的@interface部分的声明

        方法的声明中,两个关键字:

         @required标注的方法为必须实现的方法;

         @optional标注的方法为可以选择实现;

         语法:

             @protocol 协议名称

              //方法列表

              @end

        案例:

             //在协议SaleHouseProtocal.h文件中 

             //声明一个协议

              

             接下来:

             //新建一个HouseHold类,相当于接收到这个协议,并管理这个协议,需要找个代理来实现这份协议(即寻找合适者签这份协议)

             //在HouseHold.h文件中

             

            //HouseHold.m文件中

            

            接下来:

            新建一个Manager类为delegate代理者

            //在Manager.h文件中

            

             在Manager.m文件中

             

             在main函数中:

             

            结果为:

           

           注意:在实现协议的时候,不光能实现一个协议,一个类可以同时遵循多个协议

           语法:

                @interface ClassName:父类名<协议1,协议2...>    

                @end 

                @implementation ClassName

                   //实现协议中的方法

                @end

    总结:

           协议声明了可以被任何类实现的方法。

           协议不是类,它是定义了一个其他对象可以实现的接口。

           如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议。

           协议经常用来实现委托对象。一个委托对象是一种用来协同或者代表其他对象的特殊对象。

           协议与数据类型,协议可以当做变量,参数类型限定。

           在使用委托的时候,注意循环引用问题,委托的属性要使用assign,不要用retain。 

  • 相关阅读:
    A working example of bad SQL statement causes too much CPU usage
    Notes on <<Refactoring Databases Evolutionary Database Design>>
    DBMS_SQL & ORA01000: Too many open cursors
    TTS, not used for schema exp/imp
    Notes on <High Performance MySQL> Ch6: Optimizing Server Settings
    Notes on <High Performance MySQL> Ch3: Schema Optimization and Indexing
    A bug of "sql*loader"?
    11.2.0.2 improves the support for MERGE statement
    Use "OR" in SQL with caution
    关于NORFLASH和NANDfLASH的区别。——Arvin
  • 原文地址:https://www.cnblogs.com/taopengcun/p/3683646.html
Copyright © 2011-2022 走看看