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

//我设置的协议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. python安装pip和使用pip安装Python库类比如pip安装beautifulsoup4

    初学Python时,看到很多不懂得东西,比如 pip, 是python 包管理工具,pip是easy_install的取代. Distribute是对标准库disutils模块的增强,我们知道disu ...

  2. Web API的几种调用方式

    示例是调用谷歌短网址的API. 1. HttpClient方式: public static async void DoAsyncPost() { DateTime dateBegin = DateT ...

  3. 《Android源码设计模式》--策略模式

    No1: 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. No2: 使用场景: 1)针对同一类型问题的多种处理方式,仅 ...

  4. <泛> 并查集

    最近写这些东西呢,主要是整理一下知识,自己写一遍,看看还是不是我的. 原理与实践相结合,缺一不可 背景 有时候,给你一张很复杂的关系网络图,如果关系具有传递性,那么,我们该如何处理这些关系集合. 一个 ...

  5. PreEssentials与MFC集成使用

    ProEssentials是Gigasoft公司开发的一个功能十分强大的分发免费的工控图表.它提供了几乎所有的曲线显示形式,支持多种开发工具,提供以下接口供开发者调用:.NET(WinForm).AS ...

  6. 百度乐播音乐真实地址查找api接口

    1.百度乐播官网:http://lebo.baidu.com: 随便点击进去一个音乐界面,如:http://lebo.baidu.com/album/9036366 2.chrome浏览器右击'检查' ...

  7. [UOJ240]aliens

    学习了一下凸优化DP,感觉挺有意思的 首先把所有点对称到左下角,然后以每个点为顶点画等腰直角三角形,将被覆盖的点去掉,现在所有点从左上到右下横纵坐标都是递增的,设坐标为$(x_{1\cdots M}, ...

  8. zoj 2587 判断最小割的唯一性

    算法: 先求出残量网络,计算出从src能够到的点集A,再求出能够到dst的点集B,如果所有点都被访问到了,那么割就是唯一的,即(A,B),否则(A,V-A)和(V-B,B)都是最小割. (注意因为割的 ...

  9. UVALive 6885 Flowery Trails 最短路

    Flowery Trails 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid= ...

  10. tyvj 1004 滑雪 记忆化搜索

    滑雪 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.tyvj.cn/p/1004 Description     trs喜欢滑雪.他来 ...