当前位置:网站首页>OC-协议
OC-协议
2022-08-04 21:37:00 【彭同学她同桌】
什么是协议
定义一组方法 由其他类来实现。
如果一个类实现了这个协议则代表这个类遵循了这个协议
格式
@protocol 协议的名字<父协议> // 一般情况下 父协议是NSObject
创建协议
//Pro.h
@protocol pro<NSObject>
-(void)play;//并不在Son的头文件中声明 而是在协议中声明这个方法
@optional//标识下面这个函数可实现 也可以不实现
-(void)read;
@required//标识下面这个函数必须实现 默认就是required
-(void)eat;
@end
导入协议
//Son.h
import"Pro.h"
@interface Son:NSObject<pro/*,这里可以添加其他的协议*/>
//-(void)play//不声明
@end
//Son.m
import"Son.h"
@implementation Son
-(void)play
{
NSLog(@"%@",__func__)
}
@end
//main.m
import"Foundation/Foundation.h"
import"Son.h"
int main()
{
Son *s = [[Son alloc]init];
[s play];//发现也能调用
}
协议限制传入的参数 也可以限制成员变量
创建协议
//people.h 创建一个人的协议
@protocol people<NSObject>
-(char*)name;
-(id)initWithName;
@end
创建女人类
//Woman.h
import"people.h"
@interface Woman:NSObject<people>
{
char *_name;
id friend;//可以改成下面这样
}
//@property id<people>friend;//直接限制成员变量
-(void)setWithFriend:(id)<people>f
@end
//Woman.m
import"Woman.h"
@implementation Woman
-(void)setWithFriend:(id)<people>f//只允许与遵守人协议的对象做朋友
{
NSLog(@"%@:%@",__func__,[f name]);
}
-(id)initWithName:(char*)n;
{
if((self = [[super alloc]init])!= nil)
{
_name = n;
}
return self;
}
-(char*)name
{
return name;
}
@end
创建男人类
//Man.h
import"people.h"
@interface Man:NSObject<people>
{
char *_name;
id *friend;
}
@end
//Man.m
import"Man.h"
@implementation Man
-(id)initWithName:(char*)n;
{
if((self = [[super alloc]init])!= nil)
{
_name = n;
}
return self;
}
-(char*)name
{
return name;
}
@end
创建狗类
//Dog.h
@interface Dog:NSObject
@end
//Dog.m
import"Dog.h"
@implementation Dog
@end
main
int main()
{
Woman *hong = [[Woman alloc]initWithName:@"小红"];
Man*ming = [[Man alloc]initWithName:@"小明"];
Dog*huang = [[Dog alloc]init];
[hong setWithFriend:ming];//setWithFriend:小明
//[hong setWithFriend:huang];//这样就会报错 因为dog不遵守人的协议
}
BOOL conformsToProtocol: 判断是否遵循协议
[hong conformsToProtocol:@protocol(people)];
边栏推荐
- mysql基础
- Codeforces Round #811 (Div. 3)
- proe和creo的区别有哪些
- 数电快速入门(四)(组合逻辑电路的分析以及设计的介绍)
- 七夕特制:《牛郎会织女》
- 数电快速入门(三)(卡诺图化简法的介绍)
- SPSS-System Clustering Software Practice
- How to solve the problem that the alarm information cannot be transmitted after EasyGBS is connected to the latest version of Hikvision camera?
- 数电快速入门(二)(复合逻辑运算和逻辑代数的基本定律的介绍)
- 立即升级!WPS Office 出现 0day 高危安全漏洞:可完全接管系统,官方推出紧急更新
猜你喜欢

Arduino 电机测速
![[larave]关于laravel使用form submit()不能获取值问题](/img/2f/a7a17b1497390509edd6d096e8e473.png)
[larave]关于laravel使用form submit()不能获取值问题

DSPE-PEG-Aldehyde,DSPE-PEG-CHO,磷脂-聚乙二醇-醛基一种疏水18碳磷脂

js data type, throttling/anti-shake, click event delegation optimization, transition animation

docker 部署redis集群

搬走地下空间开发利用“绊脚石” 中地数码取得地下空间透明化技术突破

【PCBA program design】Grip dynamometer program

NFT宝典:你需要知道NFT的术语和定义

unity2D横版游戏教程9-对话框dialog

proe和creo的区别有哪些
随机推荐
ES6高级-Promise的用法
数字重塑客观世界,全空间GIS发展正当其时
七夕特制:《牛郎会织女》
命名路由、组件中name的作用
基于 Milvus 和 ResNet50 的图像搜索(部署及应用)
PyTorch Geometric (PyG) 安装教程
如何为Web3.0世界启动完美的DAO
SPSS-System Clustering Software Practice
Go----Go 语言基础之标识符、关键字、命名规范、变量、常量
matlab drawing
多个平台显示IP属地,必须大力推行互联网实名制
STM32MP157A驱动开发 | 01- 板载LED作为系统心跳指示灯
laravel whereDoesntHave
EasyGBS接入最新版海康摄像头后无法传递告警信息该如何解决?
《剑指offer》刷题分类
大势所趋之下的nft拍卖,未来艺术品的新赋能
可视化工作流引擎开发OA系统,让企业少花冤枉钱
LayaBox---TypeScript---举例
LayaBox---TypeScript---首次接触遇到的问题
openresty lua-resty-template页面静态化