------
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;
}
@end
4.可选方法和必选协议
#import <Foundation/Foundation.h>
@protocol CommomDelegate <NSObject>
//表示下面的方法必须实现
//细节:默认是@repuired,是必须实现的
@required
//用于输出
-(void)printInformation;
//用于比较
//不同的对象比较(人和狗)
-(int)myComepare:(id)obj;
//为了使用统一的接口获取名字
-(NSString *)name;
@optional//可选的 意味着可以实现或者可以不实现
-(void)opt;
@end
5.协议扩展
1.类能否多继承?---单继承
一个类可以遵守多个协议
2.协议中的方法是否必须实现
如果是可选的方法可以不实现,没有任何问题
如果是必选的方法,如果不实现编译有警告,运行的时候可能崩溃