标签:
八. oc基础知识(Protocal)
protocal 出发点:他仅仅是用来声明方法的。
1. 可以用来声明一大堆方法(但是不能声明成员变量)
2. 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明
3. 只要父类遵守了某个协议,就相当于子类也遵守了
4. 协议列出了一组方法,有些是必须实现的,有些是选择实现(@optional)。遵守协议就要实现协议里面所有必须实现的方法。
1. 定义一个协议
1 // 2 // main.m 3 // Protocal终极练习 4 // 5 // Created by keeganlee on 15/2/11. 6 // Copyright (c) 2015年 keeganlee. All rights reserved. 7 // 10 11 #import <Foundation/Foundation.h> 12 #import "Student.h" 13 #import "Agenta.h" 14 #import "Agentb.h" 15 #import "MyprotocalB.h" 16 int main(int argc, const char * argv[]) { 17 @autoreleasepool { 18 19 id<MyprotocalA> agenta=[[Agenta alloc] init]; 20 21 id<MyprotocalB> agentb=[[Agentb alloc] init]; 22 23 24 Student *stu=[Student new]; 25 26 stu.d=agenta; 27 28 [stu buyTicket]; 29 30 stu.d=agentb; 31 32 [stu buyTicket]; 33 34 35 36 } 37 return 0; 38 }
person。h
// // Person.h // Protocal终极练习 // // Created by keeganlee on 15/2/11. // Copyright (c) 2015年 keeganlee. All rights reserved. // #import <Foundation/Foundation.h> #import "MyprotocalB.h" @interface Person : NSObject <MyprotocalB> @property (nonatomic,assign) int age; @end
Person.m
// // Person.m // Protocal终极练习 // // Created by keeganlee on 15/2/11. // Copyright (c) 2015年 keeganlee. All rights reserved. // #import "Person.h" @implementation Person @end
Student.h
#import "Person.h" @interface Student : Person @property (nonatomic,strong) id<MyprotocalB,MyprotocalA> d;//因为是id类型,在student的实现时,用遵循这个协议的类的对象调用特有的方法肯定是通不过的~~但是这时候加上这个协议,就相当于告诉编译器这里面有这些方法 可以使用。所以编译器就准许通过!!~ - (void)buyTicket; @end
Student.m
#import "Student.h" @implementation Student -(void)buyTicket { int c=[_d ticketRemain];//这里虽然没有agent两个类的。h文件但是编译器仍然可以认识这个具体方法 这就是接口的好处!! NSLog(@"There has %d ticket left~",c); [_d confirmToBuy]; } @end
Agenta.h
#import <Foundation/Foundation.h> #import "MyprotocalB.h" @interface Agenta : NSObject <MyprotocalB> @end
Agentb.h
#import <Foundation/Foundation.h> #import "MyprotocalB.h" @interface Agentb : NSObject <MyprotocalB> @end
Agenta.m
#import "Agenta.h" @implementation Agenta -(int)ticketRemain { return 100; } -(void)confirmToBuy { NSLog(@"OK~~!! you have got the ticket~~"); } @end
Agentb.m
#import "Agentb.h" @implementation Agentb -(int)ticketRemain { return 1000; } -(void)confirmToBuy { NSLog(@"SORRY ~All ticekt has been solded~~~~~"); } @end
Myprotocala
#import <Foundation/Foundation.h> @protocol MyprotocalA <NSObject> - (int) ticketRemain; - (void) confirmToBuy; @end
Myprotocalb
#import <Foundation/Foundation.h> #import "MyprotocalA.h" @protocol MyprotocalB <NSObject,MyprotocalA> @end
上面这个例子实现的是一个买票程序的代理模式,其中融合了继承,多态等前面学过的好多知识。(在比较晦涩难懂的地方都加上了注释)
标签:
原文地址:http://www.cnblogs.com/keeganlee/p/4308790.html