2013-07-17 类的扩展

Objective-c中提供了可以让我们扩展类定义的手段:类目,延展和协议。
类目:为已知的类(已知的类包括自己定义的类和系统提供的类)增加新的方法;
延展:在自己类的实现中(.m文件中)添加类目来声明私有的方法
协议:协议声明了可以被任何类实现的方法。

注意:这些手段只能增加类的方法,并不能用于增加实例变量,要增加类的实例变量,只能通过定义子类来间接实现。

协议的真正作用就是传值

 


代理:让两个没有关系的类产生关系

类目 (也叫分类)
通过两部分代码来向原始类添加方法
1、以一个类目名的名义在接口中声明一些方法;
2、同样以类目名的名义在实现文件中定义这些方法的实现:

类目的好处
1、通过类目添加的方法会成为原始类的一部分;
2、通过类目添加的方法和原始类中的方法在使用起来没有任何等级差别;
3、类目里面定义的方法会被原始类的子类所继承;
4、使用类目最大的好处是能扩展被人的实现的类,而且不需要获得原始类的源代码;

类目的局限性
1)无法向类中添加新的实例变量,类目没有位置容纳实例变量
2)名称冲突,当类目中的方法和原始类方法名称冲突使,类别具有更高的优先级,类目方法将完全取代初始方法二无法再使用初始方法

类目的用处
可以扩展别人的类
把代码放到多个文件中;便于多人协作

延展
1)延展使另外一种类目,只不过是将类目写在了类的实现文件中(.m);
2)延展中定义的方法值在implementation代码区中实现;(简而言之,延展就是只将方法写在.m中,这样就变成了私有的方法)

延展说明
1)当定义延展时,如果不提供类目名,那么延展中定义的方法使必须要被实现的,如果缺少实现代码 那么编译器将会报错。
也就是

//  定义延展

@interface Host ()//未提供类目名,-(int)count方法是一定要被实现的


-(int)count;


@end

2)如果指定了类目名,则延展中的方法可以不实现

 @interface Host (SayHi)//提供了类目名,-(int)count方法可以不实现
 

-(int)count;


@end

 

延展实例代码:(注意延展是写在.m中的)

//  定义延展

@interface Host ()


-(int)count;


@end

 

// 延展中方法的实现

-(int)count

{

    return 5;

}  

协议
协议里面定义了一堆的方法,这些方法未和任何类未发生关联,它只定义了方法,但不关心具体怎么去实现这些方法。协议就像一个条款,一旦某个对象遵守了协议,那么这个对象就要去实现协议里面的相关方法。

定义协议(假设定义了一个房屋出租协议)
//协议只定义在.h文件,它没有.m文件

#import <Foundation/Foundation.h>


@protocol HouseRentProtocol <NSObject>      //定义一个房屋出租的协议
 

// 必须要实现的协议 用required修饰

@required

-(void)rentHouse:(id)aHost Money:(int)aMoney;


// 可选实现的协议  用optional修饰

@optional

-(void)transWater;


@end


确认协议(假设创建了中介所,这个中介确认了已经定义好的房屋出租协议),所谓确认协议就是实现协议中必须实现的协议(也就是必须实现的方法)

在Agent.h文件中

#import <Foundation/Foundation.h>

#import "HouseRentProtocol.h"   //导入协议    


// 确认协议  ,注意确认协议的书写格式

@interface Agent : NSObject<HouseRentProtocol>        //中介确认房屋出租协议


@end
 


//这个中介有它的方法(假设中介要做的事情是把房东的房子出租给房客)
//在Agent.m中 

#import "Agent.h"


@implementation Agent


-(void)rentHouse:(id)aHost Money:(int)aMoney   //renHouse是必须实现的协议   中介把房子出租给房客

{

    // ...中介做了很多工作

    // ...最终

    NSLog(@"%@ %d出租出去了",[aHost name],aMoney);

}


@end


//假设有一个房东,她要出租房子,因此她要找到中介
//在Host.h中

#import <Foundation/Foundation.h>

#import "HouseRentProtocol.h"


@interface Host : NSObject

{

    NSString *_name;//房东的姓名

    id<HouseRentProtocol> _delegate;//定义了一个代理delegate,这个代理已经确认了协议了   房东在中介注册了一个代理商

}



@property(nonatomic,assign)id delegate;

@property(nonatomic,retain)NSString *name;


-(id)initWithName:(NSString *)aName;


-(void)rentHouse;//房东出租房子


@end


//在Host.m文件中

#import "Host.h"

#import "Host_Private.h"

#import "HouseRentProtocol.h"

@implementation Host

@synthesize name = _name;

@synthesize delegate = _delegate; //房东找的中介代理


-(id)initWithName:(NSString *)aName

{

    if (self = [super init])

    {

        self.name = aName;

    }

    return self;

}


-(void)dealloc

{

    [_name release];

    [super dealloc];

}


-(void)rentHouse        //房东要把房子租出去

{

    //[self house2Count];

    NSLog(@"have house to sent");

    

    if ([self.delegate conformsToProtocol:@protocol(HouseRentProtocol)])

    {

        [self.delegate rentHouse:self

                           Money:1000];

    }

    

}


//在AppDeleGate.m中

 Agent *agent = [[Agent allocinit];     //中介初始化一个实例

    

 Host *h = [[Host allocinitWithName:@"包租婆"];    //房东初始化一个实例

    // 设置 代理人

 h.delegate = agent;  //房东设置一个代理
 

 [h rentHouse];    //房东出租房屋,

    


    房东注册的delegate是联系中介和房东直接的桥梁,它将两个没有关系的类联系到了一起,实现了类之间的传值,这也就是所谓的代理模式。
 


一个类实现了协议中声明的方法称为确认了该协议,协议需要被其他类所确认,否则这个协议就没有意义了。

协议的特点:
1)可以规范类的行为;
2)利于系统设计
3)利于团队开发等
4)是可选语法,并不是一定要使用协议


用协议代理传值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值