zoukankan      html  css  js  c++  java
  • 基本语法 protocols Category extension

    转:http://blog.csdn.net/wangeen/article/details/16989529

    protocol   本质就是一系列的method的声明,他并不像class是必须的选项,根据自己的设计模式来选择性的使用。 

     protocol协议时为了补充Objective-C 只能单继承的缺陷而增加的一个新功能。Objective-C重所有的方法都是虚方法,所以在oc重也就没有关键字 virtual一说,有了协议可以补充

    Objective-C单继承的缺陷,协议并不是一个真正的类,在协议的里面只声明方法不实现,并且在协议当中不能声明实例变量,如果一个类实现了某一个协议的方法,那么称折各类遵

    循(遵守,采用)了这个协议,正式的协议在类中必须被实现,一个类可以实现多个协议,一个协议也可以被多个类实现,

    Category

    http://www.cnblogs.com/chijianqiang/archive/2012/06/22/objc-category-protocol.html

    —Category—
    首先我们来谈谈Category。
     
    Objective-C提供了一种与众不同的方式——Category,可以动态的为已经存在的类添加新的行为。这样可以保证类的原始设计规模较小,功能增加时再逐步扩展。使用Category对类进行扩展时,不需要访问其源代码,也不需要创建子类。Category使用简单的方式,实现了类的相关方法的模块化,把不同的类方法分配到不同的分类文件中。
     
    实现起来很简单,我们举例说明。
    SomeClass.h
    @interface SomeClass : NSObject{
    }
    -(void) print;
    @end 
     
    这是类SomeClass的声明文件,其中包含一个实例方法print。如果我们想在不修改原始类、不增加子类的情况下,为该类增加一个hello的方法,只需要简单的定义两个文件SomeClass+Hello.h和SomeClass+Hello.m,在声明文件和实现文件中用“()”把Category的名称括起来即可。声明文件代码如下:
     
    #import "SomeClass.h"
     
    @interface SomeClass (Hello)
    -(void)hello;
    @end
    实现文件代码如下
    #import "SomeClass+Hello.h"
    @implementationSomeClass (Hello)
    -(void)hello{
        NSLog (@"name:%@ ", @"Jacky");
    }
    @end 
    其中Hello是Category的名称,如果你用XCode创建Category,那么需要填写的内容包括名称和要扩展的类的名称。这里还有一个约定成俗的习惯,将声明文件和实现文件名称统一采用“原类名+Category”的方式命名。
    调用也非常简单,毫无压力,如下:
    首先引入Category的声明文件,然后正常调用即可。
    #import "SomeClass+Hello.h"
     
    SomeClass * sc =[[SomeClass alloc] init];
    [sc hello] 
    执行结果是:
    name:Jacky 
     
    Category的使用场景:
    1、当你在定义类的时候,在某些情况下(例如需求变更),你可能想要为其中的某个或几个类中添加方法。
    2、一个类中包含了许多不同的方法需要实现,而这些方法需要不同团队的成员实现
    3、当你在使用基础类库中的类时,你可能希望这些类实现一些你需要的方法。
     
    遇到以上这些需求,Category可以帮助你解决问题。当然,使用Category也有些问题需要注意,
    1、Category可以访问原始类的实例变量,但不能添加变量,如果想添加变量,可以考虑通过继承创建子类。
    2、Category可以重载原始类的方法,但不推荐这么做,这么做的后果是你再也不能访问原来的方法。如果确实要重载,正确的选择是创建子类。
    3、和普通接口有所区别的是,在分类的实现文件中可以不必实现所有声明的方法,只要你不去调用它。
     
    用好Category可以充分利用Objective-C的动态特性,编写出灵活简洁的代码。
    —Protocol— 
    下面我们再来看Protocol。
    Protocol,简单来说就是一系列不属于任何类的方法列表,其中声明的方法可以被任何类实现。这种模式一般称为代理(delegation)模式。你通过Protocol定义各种行为,在不同的场景采用不同的实现方式。在iOS和OS X开发中,Apple采用了大量的代理模式来实现MVC中View和Controller的解耦。
     
    定义Protocol很简单,在声明文件(h文件)中通过关键字@protocol定义,然后给出Protocol的名称,方法列表,然后用@end表示Protocol结束。在@end指令结束之前定义的方法,都属于这个Protocol。例如:
    复制代码
    @protocol ProcessDataDelegate <NSObject>
    @required
    - (void) processSuccessful: (BOOL)success;
    
    @optional
    - (id) submitOrder: (NSNumber *) orderid;
    @end
    复制代码
     
    以上代码可以单独放在一个h文件中,也可以写在相关类的h文件中,可以视具体情况而定。该Protocol包含两个方法,processSuccessful和submitOrder。这里还有两个关键字,@required和@optional,表示如果要实现这个协议,那么processSuccessful方法是必须要实现的,submitOrder则是可选的,这两个注解关键字是在Objective-C 2.0之后加入的语法特性。如果不注明,那么方法默认是@required的,必须实现。
     
    那么如何实现这个Protocol呢,很简单,创建一个普通的Objective-C类,取名为TestAppDelegate,这时会生成一个h文件和m文件。在h文件中引入包含Protocol的h文件,之后声明采用这个Protocol即可,如下:
    @interface TestAppDelegate : NSObject<ProcessDataDelegate>;
    
    @end
    用尖括号(<...>)括起来的ProcessDataDelegate就是我们创建的Protocol。如果要采用多个Protocol,可以在尖括号内引入多个Protocol名称,并用逗号隔开即可。例如<ProcessDataDelegate,xxxDelegate>
     
    m文件如下:
    复制代码
    @implementation TestAppDelegate
    
    - (void) processSuccessful: (BOOL)success{
        if (success) {
            NSLog(@"成功");
        }else {
            NSLog(@"失败");
        }
    }
    
    @end 
    复制代码
    由于submitOrder方法是可选的,所以我们可以只实现processSuccessful。
     
    Protocol一般使用在哪些场景呢?Objective-C里的Protocol和Java语言中的接口很类似,如果一些类之间没有继承关系,但是又具备某些相同的行为,则可以使用Protocol来描述它们的关系。不同的类,可以遵守同一个Protocol,在不同的场景下注入不同的实例,实现不同的功能。其中最常用的就是委托代理模式,Cocoa框架中大量采用了这种模式实现数据和UI的分离。例如UIView产生的所有事件,都是通过委托的方式交给Controller完成。根据约定,框架中后缀为Delegate的都是Protocol,例如UIApplicationDelegate,UIWebViewDelegate等,使用时大家可以留意一下,体会其用法。
     
    使用Protocol时还需要注意的是:
    1、Protocol本身是可以继承的,比如:
    @protocol A
         -(void)methodA;
    @end
    @protocol B <A>
         -(void)methodB;
    @end

    如果你要实现B,那么methodA和methodB都需要实现。 

    2、Protocol是类无关的,任何类都可以实现定义好的Protocol。如果我们想知道某个类是否实现了某个Protocol,还可以使用conformsToProtocol进行判断,如下:
    [obj conformsToProtocol:@protocol(ProcessDataDelegate)] 
     
    好吧,具体的语言特性这次就介绍这么多。从某种意义上来说,Objective-C是一门古老的语言,发明于1980年。1988年,乔布斯的Next公司获得了Objective-C语言的授权,并开发出了Objective-C的语言库和NEXTSTEP的开发环境。NextStep是以Mach和BSD为基础,Objective-C是其语言和运行库,后来的事大家都清楚,苹果买了Next,乔布斯回归苹果,开始神奇的苹果振兴之路,NextStep成了Max OS X的基础。以后发展越来越好,Objctive-C成了Apple的当家语言,现在基本上是Apple在维护Objctive-C的发展。
     
    在苹果的AppStore推出之前,Objective-C一直相对小众,但是其优秀的语言特性似乎一直在为后面的爆发积蓄力量,当苹果平台级的应用出现之后,Objective-C开始大放异彩,静态语言的效率和动态语言的特性得到众多程序员的喜爱,目前它已经以火箭般的速度蹿升TIOBE语言排行版第四位。
     
    对于喜爱苹果技术的技术人员来说,Objective-C是你必须深入了解和值得学习的一门语言,希望以后有机会多写一些相关的文章。
     
     
    Extension
    extension可以 理解成匿名的category,同样需要括号。
    下面就是隐藏私有实现的一个例子,也是extension一个常用的方式。
    
    
    @interface MyClass : NSObject
    @property (retain, readonly) float value;
    @end
    
    // Private extension, typically hidden in the main implementation file.
    @interface MyClass ()
    @property (retain, readwrite) float value;
    @end

    extension 常常被用来限定属性的访问权限。比如一个属性提供对外可读,但是对内要可读可写。就用extension实现。
  • 相关阅读:
    Redis命令
    Linux命令
    SQL语句
    Redis集群
    Redis主主复制、主从复制
    关于Java乱码
    组合, 封装, 访问限制机制, property装饰器, 多态
    继承
    小练习
    面向过程与面向对象, 类和对象
  • 原文地址:https://www.cnblogs.com/ygm900/p/4589539.html
Copyright © 2011-2022 走看看