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

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

 //  Myprotocol.h
// 协议
//
// Created by ma c on 15/8/12.
// Copyright (c) 2015年. All rights reserved.
// #import <Foundation/Foundation.h> @protocol Myprotocol
@property(nonatomic,assign)NSInteger integer;
-(id)initWithInteger:(NSInteger) i;
-(void) show2;
-(void)print;
-(void) initialize;
@end

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

 //  Teacher.h
// 协议
//
// Created by ma c on 15/8/12.
// Copyright (c) 2015年. All rights reserved.
// #import <Foundation/Foundation.h>
@protocol TeacherDelegate//老师制定协议规则
@required //在协议代理人类中必须要全部实现的方法
-(void) show1;
-(void) Standup;
-(void) Answerquestion;
@optional //协议代理人类中可以选择性的实现(可以实现,也可以不用实现)
-(void) Setdown;
@end @interface Teacher : NSObject
@property(nonatomic,weak) id<TeacherDelegate> delegate;
-(void)ordering;
@end
 //  Teacher.m
// 协议
//
// Created by ma c on 15/8/12.
// Copyright (c) 2015年. All rights reserved.
// #import "Teacher.h" @implementation Teacher
@synthesize delegate;
-(void)ordering
{
[delegate show1];
NSLog(@"teacher is ordering!");
[self.delegate Standup];
[self.delegate Answerquestion];
[self.delegate Setdown];
}
@end

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

 //  Student.h
// 协议
//
// Created by ma c on 15/8/12.
// Copyright (c) 2015年. All rights reserved.
// #import "Teacher.h"
#import "TeacherDelegate.h"
#import "Myprotocol.h"
@interface Student : Teacher<TeacherDelegate,Myprotocol>
@end
 //  Student.m
// 协议
//
// Created by ma c on 15/8/12.
// Copyright (c) 2015年. All rights reserved.
// #import "Student.h" @implementation Student
@synthesize integer;
//TeacherDelegate
-(void) show1
{
NSLog(@"the teacher's protocol is running!");
}
-(void) Standup
{
NSLog(@"student stand up.");
}
-(void) Answerquestion
{
NSLog(@"student answer question.");
}
-(void) Setdown
{
NSLog(@"student set down!");
}
//Myprotocol
-(void) show2
{
NSLog(@"the my protocol is running!");
}
-(id)initWithInteger:(NSInteger) i
{
self = [super init];
if(self)
{
self.integer = i;
}
return self;
}
-(void)print
{
NSLog(@"integer=%ld",self.integer);
}
-(void) initialize
{
NSLog(@"Integer's initialization succeed.");
}
@end

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

 //  main.m
// 协议
//
// Created by ma c on 15/8/12.
// Copyright (c) 2015年. All rights reserved.
// #import <Foundation/Foundation.h>
#import "Teacher.h"
#import "Student.h"
#import "Myprotocol.h"
int main(int argc, const char * argv[])
{
@autoreleasepool
{
Teacher *teacher = [[Teacher alloc]init]; //老师设置学生代理实现老师设置的协议(TeacherDelegate)
Student *student = [[Student alloc]init];
[teacher setDelegate:student];
[teacher ordering];
printf("\n"); //我设置学生代理实现我设置的协议(Myprotocol)
Student *stu = [[Student alloc]initWithInteger:];
[stu show2];
[stu print];
[stu initialize];
}
return ;
}

//运行结果

-- ::51.498 协议[:] the teacher's protocol is running!
-- ::51.499 协议[:] teacher is ordering!
-- ::51.499 协议[:] student stand up.
-- ::51.500 协议[:] student answer question.
-- ::51.500 协议[:] student set down! -- ::51.500 协议[:] the my protocol is running!
-- ::51.500 协议[:] integer=
-- ::51.500 协议[:] Integer's initialization succeed.
Program ended with exit code:

Objective-C:在类中设置不同协议的更多相关文章

  1. 在client类中设置访问属性 address,business和individua

    php 5.4中的traits,是新引入的特性,中文还真不知道如何准确翻译好.其实际的目的, 是为了有的场合想用多继承,但PHP又没多继承 ,于是就发明了这样的一个东西. Traits可以理解为一组能 ...

  2. php 类中设置成员属性方法

    class FileUpload { private $path = "./uploads"; //上传文件保存的路径 private $allowtype = array('jp ...

  3. springmvc+hibernate在实体类中设置外键

    1.表User id主键,username,password,dept... 表Attendence id主键,uid外键,time... @ManyToOne @JoinColumn(name = ...

  4. iOS 如何在自定义类中支持 "[]" 运算符

    在相应类中实现如下协议即可. 1.字典类 - (id)objectForKeyedSubscript:(NSObject <NSCopying> *)key; - (void)setObj ...

  5. ASP.NET MVC中设置跨域

    ASP.NET MVC中设置跨域 1.什么是跨域请求 js禁止向不是当前域名的网站发起一次ajax请求,即使成功respone了数据,但是你的js仍然会报错.这是JS的同源策略限制,JS控制的并不是我 ...

  6. 自定义类属性设置及setter、getter方法的内部实现

    属性是可以说是面向对象语言中封装的一个体现,在自定义类中设置属性就相当于定义了一个私有变量.设置器(setter方法)以及访问器(getter方法),其中无论是变量的定义,方法的声明和实现都是系统自动 ...

  7. js基础 js自执行函数、调用递归函数、圆括号运算符、函数声明的提升 js 布尔值 ASP.NET MVC中设置跨域

    js基础 目录 javascript基础 ESMAScript数据类型 DOM JS常用方法 回到顶部 javascript基础 常说的js包括三个部分:dom(文档document).bom(浏览器 ...

  8. C++ 理解类 和 类中的public、protected、private

    我们要明确,不只是C++有类,很多语言也会用到类,因为现在很多都是面向对象编程... 在c++中,关于类的理解,个人理解是这样的,具有共同属性的一个集合被称为类, 比如说人这个集合,具有性别,年龄,出 ...

  9. 【IOS 开发】Objective - C 面向对象高级特性 - 包装类 | 类处理 | 类别 | 扩展 | 协议 | 委托 | 异常处理 | 反射

    一. Objective-C 对象简单处理 1. 包装类 (1) 包装类简介 NSValue 和 NSNumber : -- 通用包装类 NSValue : NSValue 包装单个 short, i ...

随机推荐

  1. Java 中线程安全问题

    不好意思,一个国庆假期给我放的都不知道东西南北了,放松,很放松,差一点就弃更了,感谢那些催更的小伙伴们! 虽然没有更新,但是日常的学习还是有的,以后我尽量给大家分享一些通用知识,非技术. 但是本期还是 ...

  2. Android四大组件-服务

    Android服务 android 的服务有点类似windows的服务,没有界面,在后台长时间运行,如果我们这种需求的话我们就可以使用服务来实现. 服务的典型应用场景: 播放音乐,下载等,如果要在一个 ...

  3. 【CF540D】 D. Bad Luck Island (概率DP)

    D. Bad Luck Island time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  4. bzoj5102 [POI2018]Prawnicy 线段树

    $bzoj$跑的太慢了...... 我们考虑用线段树来解决这个问题 考虑扫描线 当扫到左端点$i$时,我们把线段$i$加入线段树 同时,对于每个左端点$i$,我们在线段树上二分出最远的$r$满足$r$ ...

  5. HDU 4641 K-string 后缀自动机 并查集

    http://acm.hdu.edu.cn/showproblem.php?pid=4641 https://blog.csdn.net/asdfgh0308/article/details/4096 ...

  6. Codeforces 1090J $kmp+hash+$二分

    题意 给出两个字符串\(s\)和\(t\),设\(S\)为\(s\)的任意一个非空前缀,\(T\)为\(t\)的任意一个非空前缀,问\(S+T\)有多少种不同的可能. Solution 看了一圈,感觉 ...

  7. hdu 5289 Assignment(2015多校第一场第2题)RMQ+二分(或者multiset模拟过程)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5289 题意:给你n个数和k,求有多少的区间使得区间内部任意两个数的差值小于k,输出符合要求的区间个数 ...

  8. hdu 3397 线段树

    题意: Change operations:0 a b change all characters into '0's in [a , b]1 a b change all characters in ...

  9. php curl 发送get和post请求示例

    <?php final class HttpClient { const TIME_OUT = 10; static function get($url) { $ch = curl_init() ...

  10. Java NIo 笔记001

    1. Channel Channel接口只提供了两个方法: package java.nio.channels; public interface Channel { public boolean i ...