黑马程序员——协议
来源:互联网 发布:pageadmin cms 公司 编辑:程序博客网 时间:2024/06/05 02:20
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1.什么是协议
(1)现实生活中的协议
就业协议,贷款协议,劳动合同,结婚协议
特点:归定了双方必须完成的事情
(2)协议的总结
计算机中:设备和要和计算机通信
什么是协议:协议是制定一个接口,为了满足统一数据和信息传递的需求
2.协议的基本语法
(1)编程中为什么需要协议-------------核心
A对象要给B对象发送消息
B对象想要知道A对象给他发送什么消息
通过协议制定接口,告诉B对象会给他发送什么样的消息
A对象担心B对象无法响应这个消息,通过协议规定B 对象必须实现的方法
(2)协议的语法
(1)现实生活中的协议
就业协议,贷款协议,劳动合同,结婚协议
特点:归定了双方必须完成的事情
(2)协议的总结
计算机中:设备和要和计算机通信
什么是协议:协议是制定一个接口,为了满足统一数据和信息传递的需求
2.协议的基本语法
(1)编程中为什么需要协议-------------核心
A对象要给B对象发送消息
B对象想要知道A对象给他发送什么消息
通过协议制定接口,告诉B对象会给他发送什么样的消息
A对象担心B对象无法响应这个消息,通过协议规定B 对象必须实现的方法
(2)协议的语法
实例:协议最简单的用法
需求:Test类
想要给Test发送一个消息length,担心Test无法响应
思路:使用协议
<1>制定协议
<2>遵守协议
<3>执行协议(实现协议中的方法)
细节:一般情况下 A类指定指定协议 B类遵守协议和实现协议中的方法
3.协议的例子-----不同对象的排序-----核心心
需求:输出这些对象需求:Test类
想要给Test发送一个消息length,担心Test无法响应
思路:使用协议
<1>制定协议
<2>遵守协议
<3>执行协议(实现协议中的方法)
细节:一般情况下 A类指定指定协议 B类遵守协议和实现协议中的方法
#import <Foundation/Foundation.h> #import "Test.h" int main(int argc, const char * argv[]) { @autoreleasepool { id test=[[Test alloc] init]; //假设:系统给自己写的类Test发送消息 int l=(int)[test length]; NSLog(@"%d",l); } return 0;}#import <Foundation/Foundation.h>//@protocol表示制定了一个协议//SystemDelegate表示协议的名字//编程规范:如果类名是system ,那么类定义的协议一般为 SystemDelegate//<NSObject>//类名或者协议名加上<>表示遵守协议//注意:此处为NSObject 它是一个协议@protocol SystemDelegate <NSObject>//在协议中添加让遵守协议的类必须要实现的方法声明-(int)length;@end#import <Foundation/Foundation.h>//让test类遵守协议//遵守协议的效果://如果一个类遵守了某个协议:没有实现协议中必须实现的方法,系统会报警,提示协议中的方法没有实现#import "SystemDelegate.h"//加上头文件@interface Test : NSObject <SystemDelegate>//类名的后面加上<SystemDelegate>表示遵守了SystemDelegate协议@end#import "Test.h"@implementation Test-(int)length{ return 1000;}@end
3.协议的例子-----不同对象的排序-----核心心
不管是神马对象都用printIformation方法输出
问题:dog没有printInformation程序方法
解决:通过协议让dog类和person类都实现这个方法
<1>制定协议(协议添加方法声明)
<2>遵守协议
<3>执行协议
#import <Foundation/Foundation.h>#import "Person.h"#import "Dog.h"int main(int argc, const char * argv[]){ @autoreleasepool { Dog *momo=[[Dog alloc] init]; momo.nickname = @"momo"; momo.price = 1000; Dog *yaoyao=[[Dog alloc] init]; yaoyao.nickname = @"yaoyao"; yaoyao.price = 2000; Person *lilei = [[Person alloc] init]; lilei.name = @"lilei"; lilei.age = 23; Person *wanglei = [[Person alloc] init]; wanglei.name = @"wanglei"; wanglei.age = 24; Person *naicha=[[Person alloc] init]; naicha.name=@"naichameimei"; naicha.age=20; NSArray *arr=@[momo,yaoyao,lilei,wanglei,naicha]; for (id obj in arr) { //[obj printInformation]; } //<2>数组中包含不同的对象 // 需求:需要对这些对象进行排序 // 按照名字升序排序 NSMutableArray *marr=[[NSMutableArray alloc] initWithArray:arr]; [marr sortUsingSelector:@selector(myComepare:)]; for (id obj in marr) { [obj printInformation]; } } return 0;}#import <Foundation/Foundation.h>@protocol CommomDelegate <NSObject>//用于输出-(void)printInformation;//用于比较//不同的对象比较(人和狗)-(int)myComepare:(id)obj;//为了使用统一的接口获取名字-(NSString *)name;@end#import <Foundation/Foundation.h>#import "CommomDelegate.h"@interface Dog : NSObject<CommomDelegate>@property (copy,getter = name)NSString *nickname;@property int price;-(int)myComepare:(id)obj;@end#import "Dog.h"@implementation Dog-(void)printInformation{ NSLog(@"name=%@,age=%d",_nickname,_price);}-(int)myComepare:(id)obj;{ int r=[self.nickname compare:[obj name]]; return r>0;}@end#import <Foundation/Foundation.h>#import "CommomDelegate.h"@interface Person : NSObject<CommomDelegate>@property (copy)NSString *name;@property int age;//重写方法,或者实现协议中的的时候不需要//-(void)printInformation;@end#import "Person.h"@implementation Person-(void)printInformation{ NSLog(@"name=%@,age=%d",_name,_age);}//-(int)myComepare:(id)obj //id方法不能用点语法调用 但是可以用下面的 方法实现调用-(int)myComepare:(id<CommomDelegate>)obj{ //当前类是person类 //用self.name取 //存在的问题:obj可能是Dog可能是Person // 获取名称的时候使用的方法不一样 //int r=[self.name compare:[obj name]]; int r=[self.name compare:obj.name]; //如果r>0,则前面字符串大,需要交换 return r>0;}@end4.可选方法和必选协议
#import <Foundation/Foundation.h>@protocol CommomDelegate <NSObject>//表示下面的方法必须实现//细节:默认是@repuired,是必须实现的@required//用于输出-(void)printInformation;//用于比较//不同的对象比较(人和狗)-(int)myComepare:(id)obj;//为了使用统一的接口获取名字-(NSString *)name;@optional//可选的 意味着可以实现或者可以不实现-(void)opt;@end
5.协议扩展
1.类能否多继承?---单继承
一个类可以遵守多个协议
2.协议中的方法是否必须实现
如果是可选的方法可以不实现,没有任何问题
如果是必选的方法,如果不实现编译有警告,运行的时候可能崩溃
0 0
- 黑马程序员——协议
- 黑马程序员——OC基础---协议
- 黑马程序员——分类与协议
- 黑马程序员—–UDP协议传输
- 黑马程序员——网络协议之tcp协议和udp协议
- 黑马程序员——IOS基础——Protocol协议
- 黑马程序员——ObjC基础—协议与代理
- 黑马程序员——OC基础—-----协议与代理
- 黑马程序员——OC—block和protocol协议
- 黑马程序员——ASP.net中http协议
- 黑马程序员——ARC机制以及协议
- 黑马程序员——OC语言Protocol(协议)
- 黑马程序员——Java基础---网络协议
- 黑马程序员——OC语言的protocol协议
- 黑马程序员——OC语言中的协议protocol
- 黑马程序员——ios学习笔记 OC 协议&Block
- 黑马程序员——TCP协议传输(上)
- 黑马程序员——TCP协议传输(下)
- 基于计算机资源分析Hadoop的默认Counter
- 校园网破解教程
- Android基础之用Eclipse搭建Android开发环境和创建第一个Android项目(Windows平台)
- 父亲 儿子 苹果 女儿 橘子问题
- js关于时间常用的方法.
- 黑马程序员——协议
- 开区间和闭区间
- 《数据结构》第七章 查找技术 知识结构导图——信管113309
- 单击li标签并改变其背景样式及获得li标签的id
- The server failed to respond with a valid HTTP response
- restful webservice实战
- android SQLite使用SQLiteOpenHelper类对数据库进行操作
- Windows Hosts For Google, Fire In The Hole!
- iOS开发拓展篇-XMPP简单介绍