当前位置: 首页 > news >正文

OC基础(20)

  • Protocol基本概念
  • Protocol注意事项
  • Protocol类型限制
  • 代理设计模式

Protocol基本概念

本小节知识点:

  1. 【理解】protocol 基本概念
  2. 【掌握】protocol 语法格式
  3. 【理解】protocol和继承区别

1.protocol 基本概念

  • Protocol翻译过来, 叫做”协议”

    • 在写java的时候都会有接口interface这个概念,接口就是一堆方法的声明没有实现,而在OC里面Interface是一个类的头文件的声明,并不是真正意义上的接口的意思,在OC中接口是由一个叫做协议的protocol来实现的
    • protocol它可以声明一些必须实现的方法和选择实现 的方法。这个和java是完全不同的
  • Protocol的作用

    • 用来声明一些方法
    • 也就说, 一个Protocol是由一系列的方法声明组成的

2.protocol 语法格式

  • Protocol的定义
@protocol 协议名称
// 方法声明列表
@end
  • 类遵守协议
    • 一个类可以遵守1个或多个协议
    • 任何类只要遵守了Protocol,就相当于拥有了Protocol的所有方法声明
@interface 类名 : 父类 <协议名称1, 协议名称2,…>
@end
  • 示例
@protocol SportProtocol <NSObject>
- (void)playFootball;
- (void)playBasketball;
@end

#import "SportProtocol.h" // 导入协议
@interface Studnet : NSObject<SportProtocol> // 遵守协议
@end

@implementation Student
// 实现协议方法
- (void)playBasketball
{
    NSLog(@"%s", __func__);
}
// 实现协议方法
- (void)playFootball
{
    NSLog(@"%s", __func__);
}
@end

3.protocol和继承区别

  • 继承之后默认就有实现, 而protocol只有声明没有实现
  • 相同类型的类可以使用继承, 但是不同类型的类只能使用protocol
  • protocol可以用于存储方法的声明, 可以将多个类中共同的方法抽取出来, 以后让这些类遵守协议即可

 

Protocol使用注意

本小节知识点:

  1. 【理解】protocol 的使用注意
  2. 【理解】基协议
  3. 【掌握】@required和@optional关键字

1.protocol 的使用注意

  • 1)Protocol:就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写实现。
@protocol SportProtocol <NSObject>
{
    int _age; // 错误写法
}
- (void)playFootball;
- (void)playBasketball;
@end
  • 2)只要父类遵守了某个协议,那么子类也遵守。
@protocol SportProtocol <NSObject>

- (void)playFootball;
- (void)playBasketball;
@end
#import "SportProtocol.h"
@interface Student : NSObject <SportProtocol>
@end

@interface GoodStudent : Student
@end

@implementation GoodStudent
- (void)playFootball
{
    NSLog(@"%s", __func__);
}
- (void)playBasketball
{
    NSLog(@"%s", __func__);
}
@end
  • 3)OC不能继承多个类(单继承)但是能够遵守多个协议。继承(:),遵守协议(< >)
#import "SportProtocol.h"
#import "StudyProtocol.h"

@interface Student : NSObject <SportProtocol, StudyProtocol>

@end
  • 4)协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明
@protocol A
-(void)methodA;
@end

@protocol B <A>
-(void)methodB;
@end
@interface Student : NSObject <B>
-(void)methodA; // 同时拥有A/B协议中的方法声明
-(void)methodB;
@end

2.基协议

  • NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它

  • 还有名字也叫NSObject的协议,它是一个基协议,最根本最基本的协议

  • NSObject协议中声明很多最基本的方法

    • description
    • retain
    • release
  • 建议每个新的协议都要遵守NSObject协议

@protocol SportProtocol <NSObject> // 基协议

- (void)playFootball;
- (void)playBasketball;
@end

3.@required和@optional关键字

  • 协议中有2个关键字可以控制方法是否要实现(默认是@required,在大多数情况下,用途在于程序员之间的交流)
    • @required:这个方法必须要实现(若不实现,编译器会发出警告)
    • @optional:这个方法不一定要实现
@protocol SportProtocol <NSObject>

@required // 如果遵守协议的类不实现会报警告
- (void)playFootball;
@optional // 如果遵守协议的类不实现不会报警告
- (void)playBasketball;
@end

 

Protocol类型限制

本小节知识点:

  1. 【掌握】protocol类型限制

1.protocol类型限制

  • 设定情景:

    • 某攻城狮A希望找一个会做饭、洗衣服的女生做女朋友,有国企工作的优先。
    • 满足条件的女生都可以向他发送消息
  • 从题目中我们得到要求

    • 会做饭
    • 会洗衣服
    • 有份好工作
@protocol WifeCondition<NSObject>
- (void)cooking;
- (void)washing;
- (void)job;
@end
  • 如何在代码中要求对象必须具备这些行为?
    • 数据类型<协议名称> 变量名
// 如果没有遵守协议则会报警告
id<WifeCondition> wife = [[Person alloc] init];

 

代理设计模式

本小节知识点:

  1. 【掌握】代理设计模式基本概念
  2. 【掌握】代理设计模式示例
  3. 【理解】代理设计模式练习

1.代理设计模式基本概念

  • 什么是设计模式

    • 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
  • 什么是代理设计模式

    • 生活中大家一定遇到这样的情况了:比如说我要买一包纸,不妨就是心相印的吧,那一般人的话我应该不是去心相印的工厂里面直接去买吧,而是我们在心相印专卖店或者什么超市啊,这些地方购买,这些地方实际上就是洁丽雅毛巾的代理。这其实和我们OO中的代理模式是很相似的。
  • 代理设计模式的场合:

    • 当对象A发生了一些行为,想告知对象B(让对象B成为对象A的代理对象)
    • 对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)
    • 当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)

2.代理设计模式示例

  • 婴儿吃饭睡觉
// 协议
#import <Foundation/Foundation.h>
@class Baby;

@protocol BabyProtocol <NSObject>
- (void)feedWithBaby:(Baby *)baby;
- (void)hypnosisWithBaby:(Baby *)baby;
@end
#import "BabyProtocol.h"
@interface Baby : NSObject
// 食量
@property (nonatomic, assign) int food;
// 睡意
@property (nonatomic, assign) int drowsiness;
// 饿
- (void)hungry;
// 睡意
- (void)sleepy;
@property (nonatomic, strong) id<BabyProtocol> nanny;
@end

@implementation Baby

- (void)hungry
{
    self.food -= 5;
    NSLog(@"婴儿饿了");
    // 通知保姆
    if ([self.nanny respondsToSelector:@selector(feedWithBaby:)]) {
        [self.nanny feedWithBaby:self];
    }
}

- (void)sleepy
{
    self.drowsiness += 5;
    NSLog(@"婴儿困了");
    // 通知保姆
    if ([self.nanny respondsToSelector:@selector(hypnosisWithBaby:)]) {
        [self.nanny hypnosisWithBaby:self];
    }
}
@end
// 保姆
@interface Nanny : NSObject <BabyProtocol>
@end

@implementation Nanny

- (void)feedWithBaby:(Baby *)baby
{
    baby.food += 10;
    NSLog(@"给婴儿喂奶, 现在的食量是%i", baby.food);
}

- (void)hypnosisWithBaby:(Baby *)baby
{
    baby.drowsiness += 10;
    NSLog(@"哄婴儿睡觉, 现在的睡意是%i", baby.drowsiness);
}
@end
  • 有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情,而保姆就是这个代理人,即:婴儿和保姆之间有个协议,保姆遵守该协议,于是保姆就需要实现该协议中的条款成为代理人

3.代理设计模式练习

  • 学生通过中介找房子的过程,学生不知道怎么找所以让代理帮忙找

转载于:https://www.cnblogs.com/zhoudaquan/p/5017626.html

相关文章:

  • Android框架Picasso介绍
  • Assets遇到的问题
  • 直接拿来用!最火的Android开源项目(一)
  • python --循环对象
  • Oracle中用触发器实现自动记录表数据被修改的历史信息
  • 直接拿来用!最火的Android开源项目(完结篇)
  • 睡前小dp-codeforce414B-dp+一点点想法
  • SlidingMenu-master中的example怎样导入eclipse运行
  • echarts.js
  • 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE解决办法
  • 使用Preference保存设置
  • Android小项目蓝牙电子钟
  • 百度地图使用案例代码
  • Handler的基本使用
  • Andriod Studio Clear Project或Rebuild Project出错
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 【译】理解JavaScript:new 关键字
  • SAP云平台里Global Account和Sub Account的关系
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • webpack4 一点通
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 关于 Cirru Editor 存储格式
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 如何编写一个可升级的智能合约
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 《码出高效》学习笔记与书中错误记录
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • # 达梦数据库知识点
  • (145)光线追踪距离场柔和阴影
  • (6)STL算法之转换
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (篇九)MySQL常用内置函数
  • (三)模仿学习-Action数据的模仿
  • .Net IE10 _doPostBack 未定义
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET 设计模式初探
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET是什么
  • @Mapper作用
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [20150321]索引空块的问题.txt
  • [BZOJ4010]菜肴制作
  • [Docker]十一.Docker Swarm集群raft算法,Docker Swarm Web管理工具
  • [echarts] y轴不显示0
  • [github全教程]github版本控制最全教学------- 大厂找工作面试必备!
  • [LeetCode] Verify Preorder Sequence in Binary Search Tree 验证二叉搜索树的先序序列
  • [LeetCode]--61. Rotate List
  • [Linux](15)线程基础,线程控制,线程的互斥与同步
  • [paper] lift,splat,shooting 论文浅析
  • [Paper]Application of deep convolutional neural network for automated detection of myocardial...