分类、扩展和协议

来源:互联网 发布:高新广电网络客服电话 编辑:程序博客网 时间:2024/06/05 02:37

1.分类

  • 分类的概念
    分类是objective-c特有的一种属性,其他编程语言没有类似的模块。分类是为了给现有的类基础上增加某些方法,而不通过继承的方式,这种方法只能给类增加方法,不能增加成员变量,而且不会对原有的类产生影响。分类是类的补充和扩展,本质上是类的一部分,把一个类分成若干部分,每个部分就是分类。
  • 分类的语法
    和类的定义基本一样,只是在类名后面加一对括号及名字
    * 文件中的语法:@interface 主类类名(分类类名)
    * 文件名通常为:主类名+分类名
    * 调用方法时,只需要向主类引用放送消息即可
  • 分类的性质
    * 分类不但可以给自定义的类添加功能,还可以给不知道源代码的类添加功能。比如NSString添加一个具体网络访问功能(访问服务器)
    * 在分类中,不可以定义实例变量,也不可以定义属性,可以访问对象的属性。
    * 在运行时,分类中的方法与类原有的方法并无区别,其代码可以访问包括私有类成员变量在内的所有成员变量。
    * 若分类声明了与类中原有方法同名的函数,则分类中的方法会被调用。因此分类不仅可以增加类的方法,也可以代替原有的方法。这个特性可以用于修正原有代码中的错误,更可以从根本上改变程序中原有类的行为。若两个分类中的方法同名,则被调用的方法是不可预测的。
    * 通常来讲,分类是定义在.h文件中,但也可以定义.m文件中,此时分类的方法就变成私有方法。
    * 使用分类时,包含分类定义的头文件即可

2.扩展

      上述的分类虽然能给现有的类添加方法,但是却不能新增变量和和属性,而扩展却可以。扩展是一种特俗的分类,是一种特俗的做匿名分类,当我们不想让外部的人知道我们的方法和成员变量的时候,可以吧这些声明写到匿名类别中。一般在m文件的上方定义,形如:
#import "DynamicViewController.h"@interface ViewController ()/** 可以在这里定义属性和变量 */@end@implementation ViewController@end

3.协议

  • 协议的概念
    协议有点类似于C++里面的虚类以及Java里面的接口,但是协议不能定义变量,只能定义函数。协议是定义一个规则,要求实现该协议的子类实现协议中定义的规则,其中有些规则是可选的。
  • 协议的语法
    定义一个协议:
        @protocol协议名
        @required声明必须遵守的属性和方法
        @optional声明可选的属性和方法
    默认@required
    一个类遵守(使用)一个协议:
        @interface 类名(分类名):父类名 <协议名>
  • 协议的性质
    一个类可以同时遵守多个协议,协议之间用""号分开多个协议时,使用类似<protocol1,protocol2>这样的形式

4.示例

  • 协议文件
    ////  Animal.h//  CategoryProtocol////  Created by God Lin on 14-11-26.//  Copyright (c) 2014年 hust. All rights reserved.//#ifndef CategoryProtocol_Animal_h#define CategoryProtocol_Animal_h// 定义协议@protocol Animal <NSObject>// default is required@required-(void)showName;@optional-(void)showOptional;@end#endif

  • 分类定义文件
    ////  Cat+speak.h//  CategoryProtocol////  Created by God Lin on 14-11-26.//  Copyright (c) 2014年 hust. All rights reserved.//#import <Foundation/Foundation.h>#import "Cat.h"// 定义分类,注意语法,且只能写方法@interface Cat (speak)-(void)speak;@end

  • 分类实现文件
    ////  Cat+speak.m//  CategoryProtocol////  Created by God Lin on 14-11-26.//  Copyright (c) 2014年 hust. All rights reserved.//#import "Cat+speak.h"// 实现分类,能直接访问类属性@implementation Cat (speak)-(void)speak{    NSLog(@"%@ : 喵喵", name);}@end

  • 示例类的定义
    ////  Cat.h//  CategoryProtocol////  Created by God Lin on 14-11-26.//  Copyright (c) 2014年 hust. All rights reserved.//#import <Foundation/Foundation.h>#import "Animal.h"// 类实现协议@interface Cat : NSObject <Animal>{    NSString*   name;}@property NSString* name;-(void)showName;@end

  • 示例类的实现
    ////  Cat.m//  CategoryProtocol////  Created by God Lin on 14-11-26.//  Copyright (c) 2014年 hust. All rights reserved.//#import "Cat.h"@implementation Cat@synthesize name;-(void)showName{    NSLog(@"%@", name);}@end

  • main文件
    ////  main.m//  CategoryProtocol////  Created by God Lin on 14-11-26.//  Copyright (c) 2014年 hust. All rights reserved.//#import <Foundation/Foundation.h>#import "Cat+speak.h"int main(int argc, const char * argv[]){    @autoreleasepool    {        Cat* cat = [[Cat alloc] init];                [cat setName:@"HelloKity"];        [cat showName];        [cat speak];            }    return 0;}

  • 输出结果
    2014-11-26 22:32:45.488 CategoryProtocol[1741:303] HelloKity2014-11-26 22:32:45.490 CategoryProtocol[1741:303] HelloKity : 喵喵

0 0
原创粉丝点击