zoukankan      html  css  js  c++  java
  • OC协议

    协议:Protocol 它可以声明一些必须实现的方法和选择实现的方法
        作用:用来声明一些方法 由一系列的方法声明组成的
    一个类可以遵守1个或多个协议
    任何类只要遵守了Protocol,就相当于拥有了Protocol的所有方法声明
     
    协议和继承的区别:
    1.继承之后默认就有实现,而Protocol只有声明没有实现
    2.相同类型的类可以使用继承,但是不同类型的类只能使用(Protocol)协议
    3.Protocol可以用于存储方法的声明可以将多个类中共同的方法抽取出来,以后让这些类遵守协议即可
     
    注意点:
    1.协议只能声明方法,不能声明属性
    {
         int _age;
    }
    2.父类遵守了某个协议,那么子类也会自动遵守这个协议
    3.在OC中一个类可以遵守1个或多个协议
         注意:OC中的类只能有一个父类,也就是说OC中只有单继承
    4.OC中的协议又可以遵守其它的协议,只要一个协议遵守了其它的协议,那么这个协议中就会自动包含其他协议的声明
     
     
    基协议:
    1.NSobject是一个基类,最根本最基本的类,任何其他类最终都要继承它
    2.还有名字叫NSObject的协议,它是一个基协议,最根本最基本的协议
    3.NSObject协议中声明很多最基本的方法
         description
         retain
         release
    4.建议每个新的协议都要遵守NSObject协议
     
    @required和@optional关键字
    1.协议中的2个关键字可以控制方法是否要实现(默认是@required,在大多数情况下,用途在于程序员之间的交流)
         @required:这个方法必须要实现(若不实现,编译器会发出警告)
         @optional:这个方法不一定要实现
     
     
    #import <Foundation/Foundation.h>

    #import "Student.h"
    #import "OtherStudent.h"

    int main(int argc, const char * argv[]) {
        @autoreleasepool {
           
            OtherStudent *other = [[OtherStudent alloc] init];
       
            Student *stu = [[Student alloc] init];
            //判断是否遵循 lamcoProtocol 协议
            if ([stu conformsToProtocol:@protocol(lamcoProtocol)]) {
                //判断有没有 学习 的能力
                if ([stu respondsToSelector:@selector(study)]) {
                    [stu study];
                }
                //判断有没有 帮助找到 工作 的能力
                if ([stu respondsToSelector:@selector(work)]) {
                    [stu work];
                }
            }
            //判断是否遵循 BankProtocol 协议
            if ([stu conformsToProtocol:@protocol(BankProtocol)]) {
                //判断有没有 还款 的能力
                if ([stu respondsToSelector:@selector(giveme)]) {
                    [stu giveme];
                }
            }
            if ([other conformsToProtocol:@protocol(lamcoProtocol)]) {
                if ([other respondsToSelector:@selector(work)]) {
                    NSLog(@"可以参加培训");
                }
            } else {
                NSLog(@"不能参加培训");
            }
           
        }
        return 0;
    }
    #import <Foundation/Foundation.h>

    #import "lamcoProtocol.h"
    #import "BankProtocol.h"

    @interface Student : NSObject <lamcoProtocol,BankProtocol>

    @end
    #import "Student.h"

    @implementation Student

    -(void)study
    {
        NSLog(@"每天按时上课,复习,预习,做项目");
    }

    -(void)work
    {
        NSLog(@"保证给你安排一个技术岗位");
    }

    -(void)giveme
    {
        NSLog(@"每月按时还款");
    }
    @end
     
    #import <Foundation/Foundation.h>

    #import "lamcoProtocol.h"
    #import "BankProtocol.h"

    @interface OtherStudent : NSObject <lamcoProtocol>
    @end
    #import "OtherStudent.h"

    @implementation OtherStudent

    -(void)study
    {
        NSLog(@"每天按时上课,复习,预习,做项目");
    }

    -(void)work
    {
        NSLog(@"保证给你安排一个技术岗位");
    }

    -(void)giveme
    {
        NSLog(@"每月按时还款");
    }
    @end
     
    //BankProtocol 协议
    #import <Foundation/Foundation.h>

    @protocol BankProtocol <NSObject>

    -(void)giveme;
    @end
    //lamcoProtocol 协议
    #import <Foundation/Foundation.h>

    @protocol lamcoProtocol <NSObject>

    -(void)study;
    -(void)work;
    @end
     
     
    协议的应用场景:
    #import <Foundation/Foundation.h>

    #import "Person.h"
    #import "WifeProtocol.h"

    int main(int argc, const char * argv[]) {
        @autoreleasepool {
           
            Person *p = [[Person alloc] init];
            //1.协议的第一个应用场景,可以将协议写在数据类型的右边,明确的标注如果想给该量赋值,那么该对象必须遵守某个协议
    //        Wife<WifeProtocol> *w = [[Wife alloc] init];
           
            Wife *w = [[Wife alloc] init];
            p.wife = w;
            [p show];
           
        }
        return 0;
    }
     
    #import <Foundation/Foundation.h>
    #import "Wife.h"

    @interface Person : NSObject

    //注意:类型限定是写在数据类型的右边
    @property(strong,nonatomic) Wife<WifeProtocol> *wife;

    -(void)show;
    @end
    #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
     
    #import <Foundation/Foundation.h>
    #import "WifeProtocol.h"

    @interface Wife : NSObject <WifeProtocol>
    @end
    #import "Wife.h"

    @implementation Wife

    -(void)cooking
    {
        NSLog(@"%s",__func__);
    }
    -(void)washing
    {
        NSLog(@"%s",__func__);
    }

    -(void)job
    {
        NSLog(@"%s",__func__);
    }
    @end
    #import <Foundation/Foundation.h>

    @protocol WifeProtocol <NSObject>

    //会做饭
    -(void)cooking;
    //会洗衣服
    -(void)washing;
    //有一份好工作
    -(void)job;
    @end
     
  • 相关阅读:
    oracle日志总结
    UIScrollView,contentOffset,contentInsert的各自特点和区别?
    js动态增加表格
    判断某个对象是不是DOM对象
    IOS 中frame与bounds的区别
    删除重复项,只取其中一条数据
    NSBundle
    React
    HTML5 postMessage 和 onmessage API 详解
    SonarQube
  • 原文地址:https://www.cnblogs.com/lichengjin/p/5236257.html
Copyright © 2011-2022 走看看