您的位置:首页 > 其它

Ryan的OC学习总结-----5 协议

2016-06-24 12:42 302 查看
小提示:

在UML(统一建模语言)中“空心箭头十实线”表示继承关系,箭头指向父类,箭尾是子类。继承关系在UML中过前为“泛化”,父类是一般类,而子类是特殊类,所谓“泛化”就是父类比子类更一般化,子类比父类给特殊。

在UML(统一建模语言)中“空心箭头+虚线”表示实现关系。由于接口在ObjeCtive一C和Swi什语言称为“协议”,所以在OC和Swift语言中的实现关系称为“遵从”或“实现”协议。

一 协议的概念 
协议(protocol)与Java的Interface(接口)或者C++的纯虚类相同,就是用来声明接口的。协议只是定义了方法的列表,协议不负责实现方法,目的是让别的类来实现。

Figure中定义了。onDraw方法不能有具体的实现内容,作为父类Figure它无法知道它的子类如何绘制图形,它只能规定绘制图。它只能规定绘制图onDraw方法名、参数和返回值等信息,但不能给
出具体的实现,因此Figure应该设计成为抽象的类,在OC中就是“协议”。

二 协议声明
协议声明采用指令@protocol,协议声明只需要h文件,不需要m文件。语法如下:
@protocol 协议名
@required //required是默认的
声明必须实现的方法
@optional
声明可选实现的方法
@end三 遵从协议
@interface 类名 : 父类名 <协议1,协议2,....>
@end

@implementation 类名
//实现协议方法
@end
四 协议作为数据类型
协议累心更可以声明变量类型;协议类型可以作为方法的参数类型或者返回值类型。
示例:
id<Figure> figure1;
figure1 = [[Ellipse alloc] init];
[figuare1 onDraw];
//NSLog(@"%@", [figure1 copy]);
//unrecognized selector sent to instance

Triangle<Figure>* figure2 = [[Triangle alloc] init];
[figure2 onDraw];
//[figure2 coloring];//unrecognized selector sent to instance
NSLog(@"%@", [figure2 copy]);

@implementation Triangle
- (void) onDraw{
NSLog(@"绘制三角形");
}
- (id<Figure>)copy{
return self;
}
@end

小提示:
OC是动态语言,编辑器在编译手不会检查对象中方法是否真实存在,如果在运行期调用不存在的方法(给一个对象发送不存在的消息),则会发生unrecognized selector sent to instance错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: