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

小提示:

在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错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值