Objective-C:在类中设置不同协议

在下面的代码中,设置了两种不同的协议规则:一种是老师对学生设置的协议:即老师发出命令后,学生站起来、回答问题、坐下; 另一种是我对学生设置的协议:即学生按照我的协议中的初始化函数去初始化一个整数。

//我设置的协议Myprotocol,里面有我设置的协议规则(属性、函数)作为一个单独的文件

 1 //  Myprotocol.h
 2 //  协议
 3 //
 4 //  Created by ma c on 15/8/12.
 5 //  Copyright (c) 2015年. All rights reserved.
 6 //
 7 
 8 #import <Foundation/Foundation.h>
 9 
10 @protocol Myprotocol 
11 @property(nonatomic,assign)NSInteger integer;
12 -(id)initWithInteger:(NSInteger) i;
13 -(void) show2;
14 -(void)print;
15 -(void) initialize;
16 @end

 

//老师设置的协议和类本身的属性 .h和.m文件;在类里面直接设置协议,没有作为单独的文件

 1 //  Teacher.h
 2 //  协议
 3 //
 4 //  Created by ma c on 15/8/12.
 5 //  Copyright (c) 2015年. All rights reserved.
 6 //
 7 
 8 #import <Foundation/Foundation.h>
 9 @protocol TeacherDelegate//老师制定协议规则
10 @required //在协议代理人类中必须要全部实现的方法
11 -(void) show1;
12 -(void) Standup;
13 -(void) Answerquestion;
14 @optional //协议代理人类中可以选择性的实现(可以实现,也可以不用实现)
15 -(void) Setdown;
16 @end
17 
18 
19 @interface Teacher : NSObject
20 @property(nonatomic,weak) id<TeacherDelegate> delegate;
21 -(void)ordering;
22 @end

 

 1 //  Teacher.m
 2 //  协议
 3 //
 4 //  Created by ma c on 15/8/12.
 5 //  Copyright (c) 2015年. All rights reserved.
 6 //
 7 
 8 #import "Teacher.h"
 9 
10 @implementation Teacher
11 @synthesize delegate;
12 -(void)ordering
13 {
14     [delegate show1];
15     NSLog(@"teacher is ordering!");
16     [self.delegate Standup];
17     [self.delegate Answerquestion];
18     [self.delegate Setdown];
19 }
20 @end

 

//学生类Student 它作为实现这两种协议的代理人(委托者).h和.m文件 

 1 //  Student.h
 2 //  协议
 3 //
 4 //  Created by ma c on 15/8/12.
 5 //  Copyright (c) 2015年. All rights reserved.
 6 //
 7 
 8 #import "Teacher.h"
 9 #import "TeacherDelegate.h"
10 #import "Myprotocol.h"
11 @interface Student : Teacher<TeacherDelegate,Myprotocol>
12 @end

 

 1 //  Student.m
 2 //  协议
 3 //
 4 //  Created by ma c on 15/8/12.
 5 //  Copyright (c) 2015年. All rights reserved.
 6 //
 7 
 8 #import "Student.h"
 9 
10 @implementation Student
11 @synthesize integer;
12 //TeacherDelegate
13 -(void) show1
14 {
15     NSLog(@"the teacher's protocol is running!");
16 }
17 -(void) Standup
18 {
19     NSLog(@"student stand up.");
20 }
21 -(void) Answerquestion
22 {
23     NSLog(@"student answer question.");
24 }
25 -(void) Setdown
26 {
27     NSLog(@"student set down!");
28 }
29 //Myprotocol
30 -(void) show2
31 {
32     NSLog(@"the my protocol is running!");
33 }
34 -(id)initWithInteger:(NSInteger) i
35 {
36     self = [super init];
37     if(self)
38     {
39         self.integer = i;
40     }
41     return self;
42 }
43 -(void)print
44 {
45     NSLog(@"integer=%ld",self.integer);
46 }
47 -(void) initialize
48 {
49     NSLog(@"Integer's initialization succeed.");
50 }
51 @end

 

//主函数测试这两种协议的实现

 1 //  main.m
 2 //  协议
 3 //
 4 //  Created by ma c on 15/8/12.
 5 //  Copyright (c) 2015年. All rights reserved.
 6 //
 7 
 8 #import <Foundation/Foundation.h>
 9 #import "Teacher.h"
10 #import "Student.h"
11 #import "Myprotocol.h"
12 int main(int argc, const char * argv[])
13 {
14     @autoreleasepool
15     {
16         Teacher *teacher = [[Teacher alloc]init];
17         
18         //老师设置学生代理实现老师设置的协议(TeacherDelegate)
19         Student *student = [[Student alloc]init];
20         [teacher setDelegate:student];
21         [teacher ordering];
22         printf("\n");
23         
24         //我设置学生代理实现我设置的协议(Myprotocol)
25         Student *stu = [[Student alloc]initWithInteger:10];
26         [stu show2];
27         [stu print];
28         [stu initialize];
29     }
30     return 0;
31 }

 

//运行结果

2015-08-12 19:55:51.498 协议[1965:139749] the teacher's protocol is running!
2015-08-12 19:55:51.499 协议[1965:139749] teacher is ordering!
2015-08-12 19:55:51.499 协议[1965:139749] student stand up.
2015-08-12 19:55:51.500 协议[1965:139749] student answer question.
2015-08-12 19:55:51.500 协议[1965:139749] student set down!

2015-08-12 19:55:51.500 协议[1965:139749] the my protocol is running!
2015-08-12 19:55:51.500 协议[1965:139749] integer=10
2015-08-12 19:55:51.500 协议[1965:139749] Integer's initialization succeed.
Program ended with exit code: 0

 

posted @ 2015-08-12 19:57  XYQ全哥  阅读(206)  评论(0编辑  收藏  举报