分类和协议(代理)

 

--------分类--------

  • 分类可以模块化方法的定义,可以用于向现有的类添加新的方法。
  • 分类提供了一种简单的方式,用他可以将类的定义模块化到相关方法的组或分类中。它还提供了拓展现有类定义的简便方式,并且不必访问类的源代码,也无需创建子类。
  • 分类可以通过两种方法来实现:
    • 1.继承自一个分类:可以通过将分类名称括在类名称之后的圆括号中来确定方法所属的分类。可以继承自系统自带的,也可以继承自自己拓展的。
  • #import "Fraction"
    
    @interface  Fraction (NSObject)//确定了一个继承自NSObject的分类
    //在这里可以声明新的方法
    @end
    
    @implementation  Fraction (NSObject)
    //在这里可以实现新的方法或者重写NSObject(在于继承自哪个类)自带的方法
    @end

     

    • 2.类的拓展:创建一个未命名的分类,且在括号“()”中不指定名字。这种特殊的语法称为类的拓展。
    • #import "Fraction"
      
      @interface  Fraction ()//在这里可以声明新的方法
      @end
      
      @implementation  Fraction ()
      @end

       

  • 注意:
    • 1.如果在分类中覆写了父类中的方法之后,那么就再也不能访问原来的方法了。所以在分类中覆写方法要慎重。如果需要访问原来的方法可以通过新建子类来实现
    • 2.通过使用分类添加新方法来拓展类不仅会影响这个类,同时也会影响他的所有子类。

 

 

 

--------协议和代理--------

  • 协议是多个类共享的一个方法列表。协议提供了一种方式,用指定的名称定义一组多少有点相关的方法。如果需要,可以在自己的类定义中实现他们。
  • 协议列出了一组方法,有些可以使选择实现(@optional),有些是必须实现(@required)。
  • 定义一组协议的方式:使用 @protocol  指令,后面跟上你给出的协议名称。然后跟处理接口部分一样,声明一些方法。 @end  指令之前的所有方法声明都是协议的一部分。
  • //例子
    @protocol
    NSCopying   -(id)copyWithZone:(NSZone *) zone;   @end

     

  • 如果你的类采用了NSCopy协议,则必须遵守实现名为copyWithZone的方法.通过在@interface行的一对<>内列出协议名,如果你的类实现了多项协议,协议之间用逗号分开。
  • 可以告诉编译器你正在使用一个协议.这项协议的名称放在类名和它的父类名称之后.协议不引用任何类型,它是无类的.任何类都可以遵守Drawing协议.
  • 定义一项协议的时候,可以扩展现有的协议

 

  • 非正式协议:
    • 非正式协议中的方法不必全部实现。
    • 非正式协议实际上就是一个分类.列出了一组方法,但是并没有实现他们.每个人都继承相同的跟对象,因此非正式分来通常是为跟类定义的.又是非正式协议又叫做抽象协议
    • 声明非正式协议的类并不自己实现这些方法,并且选择实现这些方法的子类需要在他的接口部分重新声明这些方法.同时还要是实现这些方法中的一个或多个

 

 

 

协议也是一种两个类之间的接口定义。定义了协议的类可以看做是将协议定义的方法代理给了实现他们的类。这样,类的定义可以更为通用,因为具体的动作由代理类来承担,相应某些事件或者定义某些参数。

 

posted @ 2016-09-16 22:27  方晶晶  阅读(231)  评论(0编辑  收藏  举报