黑马程序员——协议

来源:互联网 发布: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)协议的语法
实例:协议最简单的用法
        需求: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.协议中的方法是否必须实现
    如果是可选的方法可以不实现,没有任何问题
    如果是必选的方法,如果不实现编译有警告,运行的时候可能崩溃

0 0
原创粉丝点击