• OC基础(20)


    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.代理设计模式练习

    • 学生通过中介找房子的过程,学生不知道怎么找所以让代理帮忙找
  • 相关阅读:
    02-27 朴素贝叶斯
    JQuery UI datepicker 使用方法(转)
    纯CSS兑现侧边栏/分栏高度自动相等(转)
    在触屏设备上面利用html5裁剪图片(转)
    简单几步让CentOS系统时间同步(转)
    百度与谷歌地图坐标转换代码(转)
    jQuery插件开发全解析(转)
    Centos 安装ImageMagick 与 imagick for php步骤详解
    将windows目录共享到linux
    Event事件的兼容性(转)
  • 原文地址:https://www.cnblogs.com/zhoudaquan/p/5017626.html
Copyright © 2020-2023  润新知