美文网首页
了解-协议(Protocal)

了解-协议(Protocal)

作者: ibingewin | 来源:发表于2019-11-26 23:33 被阅读0次

协议(Protocal)

协议 声明了任何类都可以实现的编程接口. 这就使得两个继承关系很远的类也能够相互通信, 几乎所有的对象都继承于NSObject, 也就是说, 这些对象都可以使用协议来相互通信.

这是替换子类化的一种选择.为什么这么说呢? 答案如下:

一个类可以给其它类提供有用的行为, 它就可以声明一个接口, 使用协议来出售行为. 其它任何类都可以采用这个协议,并实现其中的一个或多个方法, 从而使用该行为. 这实际上就可以实现子类化的功能, 即不同的类使用同一个接口, 却可以有不同的行为.

image

协议可以分为正式协议(Formal)和非正式协议(Informal)

  • 正式协议: 声明了客户端类要实现的方法列表. 正式协议有自己的声明、采用 和 类型检查语法, 可以通过关键字@required@optional 分别设置方法是必须要实现的还是可选的(默认是@required). 子类可以继承父类采用的正式协议. 正式协议也可以采用其它协议.
  • 非正式协议: 是NSObject的分类或类别, 隐式地使几乎所有对象都采用该协议.(类别是一个语言特性:可以不用继承类,而给该类添加方法), 非正式协议中的方法都是可选(optional)的. 在optional引入之前, FoundationAppKit都靠非正式协议来实现代理.

采用协议: 在类的接口使用<protocal>来采用正式协议, 多个协议用,分隔, 如下所示:

@interface CAAnimation : NSObject <NSCopying, CAMediaTiming, CAAction>

遵守协议: 除了采用协议外, 还要实现正式协议中必须(required)实现的方法. 如果继承于一个已遵守协议的类, 则该子类也被认为是遵守了该协议.

// 声明协议

@protocol Protocal <NSObject>
@optional
- (void)func1;
@required
- (void)func2;
@end

//A 类采用该协议, 并实现required的方法 来 遵守协议

@interface ModelA : NSObject <Protocal>
@end
@implementation ModelA
- (void)func2 {
    NSLog(@"11 %@", self);
}
@end

//B 类采用该协议, 并实现required的方法 来 遵守协议

@interface ModelB : NSObject <Protocal>
@end
@implementation ModelB
- (void)func2 {
    NSLog(@"22 %@", self);
}
@end

//B的子类 因B类遵守协议, 而遵守协议

@interface ModelSubB : ModelB
@end
@implementation ModelSubB
@end

// 分别调用协议方法

ModelA *objA = [ModelA new];
[objA func2];
ModelB *objB = [ModelB new];
[objB func2];
ModelSubB *objSubB = [ModelSubB new];
[objSubB func2];

//输出如下:

11 <ModelA: 0x600002cc86b0>
22 <ModelB: 0x600002cc86d0>
22 <ModelSubB: 0x600002cc86a0>

相关文章

  • 了解-协议(Protocal)

    协议(Protocal) 协议 声明了任何类都可以实现的编程接口. 这就使得两个继承关系很远的类也能够相互通信, ...

  • HTTP、TCP和HTTPS

    1、HTTP HTTP协议【Hyper Text Transfer Protocal】超文本传输协议。 HTTP协...

  • Http协议

    1、HTTP协议概述HTTP是什么?超文本传输协议。(Hyper Text Transfer protocal)...

  • UDP协议

    什么是UDP协议? User Datagram Protocal ,用户数据报协议,它跟TCP协议不同,TCP协议...

  • OC 协议(代理、传值、回调、多继承)

    协议的基础语法 定义协议是方法的列表协议只有一个.h文件@protocal 协议名称 //方法...

  • 22-写一个委托的interface

    先写个协议: 1.声明一个协议(只有.h文件) #import @protocal 协议名superMan<父协议...

  • FTP 网络协议学习

    目录 协议基础 对比 使用踩坑 协议基础 File Transport Protocal 使用FTP协议实际上是去...

  • 浅谈web server以及httpd的实现方式

    初识HTTP协议 HTTP(hyper text transfer protocal)作为互联网应用最广泛的协议...

  • Socket的网络编程(一)

    TCP/IP协议是目前应用最广泛的协议 IP协议(Internet Protocal)互联网协议,是支持网间互联的...

  • HTTP 协议简介 (一)

    HTTP 协议 HyperText Transport Protocal 超文本传输协议 浏览器和Web 服务器通...

网友评论

      本文标题:了解-协议(Protocal)

      本文链接:https://www.haomeiwen.com/subject/exduwctx.html