object-c-协议-protocol

协议不提供任何实现,协议体现的是规范和实现分离的设计哲学,将规范和实现分离正是一种松耦合的设计。

协议类似于Java中的接口 interface

协议定义了多个类共同的公共行为规范,这些行为是与外部交流的通道,协议通常是一组公用的方法,但不会为这些方法提供实现,方法的实现交给类去实现。


非正式协议

即使用类别实现。

如@interface NSString(a1)

@interfaca NSString(a2)

实例#import <Foundation/Foundation.h>

@interface NSObject(a1)

-(void) test;

@end


#import <Foundation/Foundation.h>

#import "NSObject+test.h"

@implementation Apple

-(void) test{

}

@end


#import <Foundation/Foundation.h>

#import "Apple.h"

int main(int arg,char*[]arg1){

@autoreleasepool{

Apple* apple=[[Apple alloc] init];

[apple test];

}

}


注意:对于非正式协议类来说,协议内的方法并不需要全部实现。但是如果这个方法一直未被实现则会报错。



正式协议

正式协议不使用@interface、@implementation关键字,使用@protocol关键字,定义格式如下

@protocol 协议名<父协议1,父协议2>

{

定义多个方法,可以不定义

}

协议名与类名采用相同的命名规则、

一个协议可以有多个直接父协议,但是协议只能继承协议,不能继承类

协议中定义的方法只能有方法签名,没有方法体


实例

#import <Foundation/Foundation.h>

@protocol Test

-(void) a1;

-(void) a2;

@end



#import <Foundation/Foundation.h>

@protocol Test2

-(void) b1;

-(void)b2;

@end


#import <Foundation/Foundation.h>

#import "Test.h"

#import "Test2.h"

@protocol Test3 <Test,Test2>

-(void) c1;

@end


协议支持多继承,类不支持多继承。集成后,子协议会获取到父协议的所有方法。


实现协议

@interface 类名 :父类

#import <Foundation/Foundation.h>

#import "Test3.h"

//继承NSObject,实现Test3协议

@interface User :NSObject<Test3>

@end



#import “User.h"

@implementation User

-(void) a1{};

-(void) a2{};

-(void) b1{};

-(void) b2{};

-(void) c1{};

@end


int main{

NSObject<User>* user=[[User allo]init];

}

正式协议和非正式协议的区别

非正式协议通过为NSObject创建类别以实现;正式协议直接使用@protocol创建。

实现非正式协议通过继承带特定类别的NSObject来实现,@interface NSNumber(fk);实现正式协议则必须使用专有的方法,@interface User :NSObject<Test3>

实现非正式协议不需要实现协议中定义的所有方法,正式协议必须实现定义的所有方法。

为了弥补正式协议必须实现所有方法的缺陷,object-c 2.0新增@optional、@required关键字。

@optional:位于 该关键字之后、@optional或@end之前声明的方法时可选的。

@required:  位于该关键字之后、@required或者@end之间声明的方法是必须的。


实例;

@protocol Test

@optional

- (void) a1;

@required

- (void) a2;

@end





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值