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错误。
在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错误。
相关文章推荐
- Servlet3.0学习总结(三)——基于Servlet3.0的文件上传
- 新的·开始
- 四种加密算法之RSA源代码-C++
- SSH整合实践与自我总结
- 第十五周项目二洗牌二
- python 虚拟环境
- 测试
- 解析json
- 飛飛(终极版)关于贺利坚贺老师的感受和总结
- Servlet3.0学习总结(二)——使用注解标注过滤器(Filter)
- 开发者和程序员需要关注的42个播客
- ANDROID版本号和版本名称的重要性介绍
- wireshark https 抓包
- HttpClient使用详解
- JS组件系列——表格组件神器:bootstrap table
- Servlet3.0学习总结(一)——使用注解标注Servlet
- 歌曲《圣诞节十二天》歌词打印("The Twelve Days of Christmas" Song)
- leetcode 78. Subsets
- (转)linux虚拟内存管理简要总结
- [JAVA]定时任务之-Quartz使用篇