• oc65--协议应用1,接口.做数据类型限定


    //  WifeCondition.h
    
    #import <Foundation/Foundation.h>
    
    @protocol WifeCondition <NSObject>
    // 会做饭
    - (void)cooking;
    // 会洗衣服
    - (void)washing;
    // 有一份好工作
    - (void)job;
    @end
    //  Person.h
    
    #import <Foundation/Foundation.h>
    #import "Wife.h"
    
    @interface Person : NSObject
    
    // 媳妇
    // 注意: 记住一点, 类型限定是写在数据类型的右边的,协议修饰成员变量
    @property (nonatomic, strong) Wife<WifeCondition> *wife;
    
    - (void)show;
    
    @end
    //  Person.m
    
    
    #import "Person.h"
    
    @implementation Person
    
    - (void)show
    {
    //    注意: 虽然在接受某一个对象的时候, 对这个对象进行了类型限定(限定它必须实现某个协议), 但是并不意味着这个对象就真正的实现了该方法. 所以每次在调用对象的协议方法时应该进行一次验证
        
        if ([self.wife respondsToSelector:@selector(cooking)]) {  //验证对象有没有实现这个方法
            
            [self.wife cooking];
        }
        
        if ([self.wife respondsToSelector:@selector(washing)]) {
            
            [self.wife washing];
        }
        
        if ([self.wife respondsToSelector:@selector(job)]) {
            
            [self.wife job];
        }
    }
    @end
    //  Wife.h
    
    #import <Foundation/Foundation.h>
    #import "WifeCondition.h"
    
    @interface Wife : NSObject <WifeCondition>    //协议就是写了接口的声明
    
    @end
    //  Wife.m
    
    #import "Wife.h"
    
    @implementation Wife
    // 会做饭
    - (void)cooking
    {
        NSLog(@"%s", __func__);
    }
    // 会洗衣服
    - (void)washing
    {
        NSLog(@"%s", __func__);
    }
    // 有一份好工作
    - (void)job
    {
        NSLog(@"%s", __func__);
    }
    @end
    //
    //  main.m
    //  协议的应用场景1-类型限定
    
    #import <Foundation/Foundation.h>
    #import "Person.h"
    #import "Wife.h"
    #import "WifeCondition.h"  //导入.h文件,就是导包。
    
    int main(int argc, const char * argv[]) {
    
        Person *p = [Person new];
        // 1.协议的第一个应用场景, 可以将协议写在数据类型的右边, 明确的标注如果想给该变量赋值, 那么该对象必须遵守某个协议
    //    Wife<WifeCondition> *w = [Wife new];
        
        Wife *w = [Wife new];
        p.wife = w;
        
        [p show];
        
        return 0;
    }
  • 相关阅读:
    Android 亮度调节
    Android异步回调中的UI同步性问题
    Java总结篇系列:Java 反射
    Node入门教程(4)第三章:第一个 Nodejs 程序
    Node入门教程(3)第二章: Node 安装
    Node入门教程(2)第一章:NodeJS 概述
    Node入门教程(1)目录
    前端面试题:JS中的let和var的区别
    IT学习逆袭的新模式,全栈实习生,不8000就业不还实习费
    11-移动端开发教程-zepto.js入门教程
  • 原文地址:https://www.cnblogs.com/yaowen/p/7437090.html
Copyright © 2020-2023  润新知