黑马程序员技术交流社区
标题: 协议 [打印本页]
作者: wdcew 时间: 2015-8-15 21:41
标题: 协议
本帖最后由 wdcew 于 2015-8-15 23:51 编辑
基协议介绍
NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它,它还有名字也叫 NSObject的协议,它是一个基协议,最根本最基本的协议
NSObject协议中声明很多最基本的方法
description
Retain
release
[url=]建议[/url]每个新的协议都要遵守NSObject协议(默认)
Protocol的概念
是多个类共享的一个方法列表。协议中罗列出的方法没有相应的实现。同时Protocl是一个无类(classless)。任何类都可以遵循 协议。
[url=]protocol[/url]的使用流程
协议的使用流程:
定义协议----> 在类中采用指定的协议---->实现协议中的方法(注意方法有必须实现和选择实现两种)
1)定义协议
协议的定义
@protocol 协议名称 <NSObject>
@protocol NSCompairsonMethods<NSObject>
@optional
- (BOOL)isEqualTo:(id)object;
- (BOOL)isLessThanOrRqualTo:(id)object;
- (BOOL)isLEssThan:(id)object;
- (BOOL)isGreaterThan:(id)object;
- (int)compare:(id)f;
-(void) printf;
@end
@end; Work.h
#import <Foundation/Foundation.h>
@protocol Work [url=]<NSObject>[/url]
-(void)myWork;
@end
注意: 协议默认的要采纳NSObject的协议
类如果不想公开的.h文件中声明你的类遵守的协议,你可以将协议像分类扩展一样写在你的.m文件中
Fraction ()<NSCompairsonMethods>
2)采纳协议
(1)类遵守协议
创建类的时候遵守某个或者某几个协议
@interface 类名 : 父类 <协议名称>
[url=]@end[/url]
[url=]@interface[/url] Fraction:NSObject<NSCompairsonMethods>
[url=]….[/url]
@end
//默认遵守NSObject协议
@interface 类名 : 父类 <协议名称1,协议名称2>
@end
@interface Fraction:NSObject<NSCompairsonMethods,Run>
….
@end
某个协议也遵守某个或者某些协议,一个协议可以遵守其他多个协议,
(1)协议遵守协议
@protocol 协议名称 <其他协议名称>
@end
(2)多个协议之间用逗号 , 隔开。
@protocol 协议名称 <其他协议名称1, 其他协议名称2> @end
(3)实现协议中的方法
3)[实现协议中的方法
如果一个类遵守了某个协议 则需要在这个类的实现(.m)文件中,实现协议的方法就可以了
4)测试 类是否遵守协议
可以使用 comformssToProtocol: 方法检查一个对象是否遵守某项协议。
If (Fraction conformsToProtocol:@protocol(NSCompairsonMethods) ]== YES);
作者: wdcew 时间: 2015-8-15 21:43
本帖最后由 wdcew 于 2015-8-15 23:54 编辑
5Protoco的使用注意
OC中的协议(protocol)使用注意:
1)Protocol:就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写实现。
2)只要某个类遵守了这个协议,就拥有了这个协议中的所有方法声明。
3)只要父类遵守了某个协议,那么子类也遵守。
4)Protocol声明的方法可以让任何类去实现,protocol就是协议。
5)OC不能继承多个类(单继承)但是能够遵守多个协议。继承(:),遵守协议(< >)
6)基协议:<NSObject>是基协议,是最根本最基本的协议,其中声明了很多最基本的方法。
7)协议可以遵守协议,一个协议[url=]遵守了另一协议,就可以拥有另一份协中的方法声
1协议之间可以有继承关系
使用Protocol时还需要注意的是:
1、protocol也可以采纳其他的协议,比如:
@protocol A
-(void)methodA;
@end
@protocol B <A>
-(void)methodB;
@end
如果你要遵守B协议,那么methodA和methodB都需要实现。
2.果采纳协议后,实现了协议的方法,这些方法可以被子类继承
比如:
Person类采纳了Run和Work两个协议,并实现了两个方法
Student类继承了Person类,则此时Student 类中可以调用和重写协议中的方法(实际上是子类 Student 继承自Person的方法)
6)protocol中@required和@optional
@required和@optional是 协议方法声明中的两个关键字 他们主要用于控制方法是否要实现(默认是@required),在大多数情况下, 用途在于程序员之间的交流
@public
@protected
@private
@package
@protocol RunProtocol <NSObject>
//@required表示必须要实现的方法 @required
-(void)run;
//可以选择实现的方法 @optional
-(void)eat; @end
6)protocol 类型的限制
1)使用id存储对象时,对象的类型限制
格式:id <协议名称> 变量名
如:id <Myprotocol> obj1;
//这样写以后,表示只要是个人都满足条件,不满足题意
id girlFriend = [[Person alloc] init];
//下面写法表示,赋值给girlFriend的对象必须采纳了houseHold协议
//如果不满足,则给出警告
id<houseHold> girlFriend = [[Person alloc] init];
如果修改Person,让Person 采纳houseHold协议,则此时不会报错了
#import <Foundation/Foundation.h>
#import "houseHold.h"
@interface Person : NSObject<houseHold>
@end
2)对象赋值时类型限制
使用类也同样如此
格式:类名<协议名称> *变量名
NSObject<Myprotocol> *obj;
注意: 当采用 id<drawing>currentObject;
编译器校验,所以向currentObject指派一个id变量不会报错,因为编译器无法知道存储在id变量对象是否遵守Drawing协议。
2、protocol代理模式应用场合
代理设计模式的场合:
* 当对象A发生了一些行为,想告知对象B (让对象B成为对象A的代理对象)
* 对象B想监听对象A的一些行为 (让对象B成为对象A的代理对象)
* 当对象A无法处理某些行为的时候,想让对象B帮忙处理 (让对象B成为对象A的代理对象)
1)监听器的场合
* Teacher想监听Baby的一些行为
2)通知的场合
* Baby发生了一些行为,想告知Teacher
3)有些事情,不想自己处理,想交给别人处理
* Baby发生了一些行为, 但是自己不会处理, 可以交给Teacher处理
作者: xiaoguang 时间: 2015-8-15 23:23
我去,这完全看不懂啊
作者: wdcew 时间: 2015-8-15 23:54
额,是我写的太乱了?
作者: aidan 时间: 2015-8-16 20:07
暂时还看不懂。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |