zoukankan      html  css  js  c++  java
  • OC之【@protocol协议】

    #import <Foundation/Foundation.h>

    @protocol Study <NSObject>

    //协议只是一堆方法的声明,也就是说协议只有头文件.h,没有.m文件 实现文件,谁遵守协议,谁就要实现协议里地方法.

    //协议里面的方法,有俩个大类:@required @optional

    //@required修饰的方法是必须实现的,@optional修饰的方法是可选实现.

    //协议通常与代理一起实现!!

    // 默认就是@required

    MarryProtocol.h

    @protocol MarryProtocol <NSObject>

     

    @required

    - (void)makeMoney;

    - (void)cook;

    - (void)washClothes;

    - (void)doHoushWork;

     

    @optional

    - (void)takeCareBaby;

    //  Girl.h

     

    //实例对象(代理对象)必须是一个接受了结婚协议的对象

    //想要成为丈夫,就必须接受这个协议.

    //

    @interface Girl : NSObject

    {

        NSString *_name;

        id<MarryProtocol> _delegate; //代理对象 接受结婚协议的对象

     

    }

    - (void)setName:(NSString *)name;

    - (NSString *)name;

     

    - (void)setDelegate:(id<MarryProtocol>)delegate;

    - (id<MarryProtocol>)delegate;

     

    - (instancetype)initWithName:(NSString *)name;

    + (instancetype)girlWithName:(NSString *)name;

     

     

    - (void)work;

     

     

    - (void)clothDirty;//衣服脏了

     

    - (void)hungry;//饿了

     

    - (void)houseDirty;//屋子脏了

     

    - (void)shopping;//购物

     

    @end

    //  Girl.m

    @implementation Girl

    - (void)setName:(NSString *)name

    {

        _name = name;

    }

    - (NSString *)name

    {

        return _name;

    }

    - (void)setDelegate:(id<MarryProtocol>)delegate

    {

        _delegate = delegate;

    }

     

    - (id<MarryProtocol>)delegate

    {

        return _delegate;

    }

     

    - (instancetype)initWithName:(NSString *)name

    {

        self = [super init];

        if(self)

        {

            [self setName:name];

          //  [self setDelegate:delegate];

        }

        return self;

    }

    + (instancetype)girlWithName:(NSString *)name

    {

        return [[Girl alloc] initWithName:name];

    }

     

     

    - (void)work

    {

        NSLog(@"每天都是写代码");

    }

     

    - (void)clothDirty  //衣服脏了

    {

        [_delegate washClothes];

    }

     

    - (void)hungry//饿了

    {

        [_delegate cook];

    }

     

    - (void)houseDirty//屋子脏了

    {

        [_delegate doHoushWork];

    }

     

    - (void)shopping//购物

    {

        [_delegate makeMoney];

    }

     

    @end

    //  Boy.h

    #import "MarryProtocol.h"

    @interface Boy : NSObject <MarryProtocol>

    {

        NSString *_name;

     

    }

     

    - (void)setName:(NSString *)name;

    - (NSString *)name;

     

    - (instancetype)initWintName:(NSString *)name;

    - (void)work;

     

    - (void)makeMoney;

    - (void)cook;

    - (void)washClothes;

    - (void)doHoushWork;

     

    @end

    Boy.m

     

    @implementation Boy

    - (void)work

    {

        NSLog(@"分析程序结构,设计程序架构");

    }

     

    - (void)clothDirty//衣服脏了

    {

        NSLog(@"洗衣服");

    }

     

     

    - (void)makeMoney

    {

        NSLog(@"辛勤工作,上交工资");

    }

     

    - (void)doHoushWork//屋子脏了

    {

        NSLog(@"做牛做马,");

    }

     

    - (void)cook

    {

        NSLog(@"做饭");

    }

     

    - (void)washClothes

    {

        NSLog(@"洗衣服");

    }

     

    @end

    mian.m

       Girl *girl = [Girl girlWithName:@"林志玲"];

      Boy *boy = [[Boy alloc] initWintName:@"屌丝"];

        [girl setDelegate:boy];

        [girl hungry];

        [girl clothDirty];

        [girl houseDirty];

        [girl shopping];

     

     

     

     

     

     

    - (void)test3;

    // @required表示必须实现的方法

    // 虽然字面上说是必须实现,但是编译器并不强求某个类进行实现

    @required

    - (void)test;

    - (void)test1;

    // @optional表示可选(可实现也可不实现)

    @optional

    - (void)test2;

    @end

    main.m文件

    #import <Foundation/Foundation.h>

    #import "Student.h"

    @protocol Study;

    int main(int argc, const char * argv[])

    {

        @autoreleasepool {

            Student *stu = [[[Student alloc] init] autorelease];

            

            // OC是弱语法的,对类型要求不严格

            // NSString *stu = [[[Student alloc] init] autorelease];

            // [stu stringByAbbreviatingWithTildeInPath];

            

            // conformsToProtocol:判断是否遵守了某个协议

            if ([stu conformsToProtocol:@protocol(Study)]) {

                NSLog(@"Student遵守了Study这个协议");

            }

            

            // respondsToSelector:判断是否实现了某个方法

            if ( ![stu respondsToSelector:@selector(test)] ) {

                NSLog(@"Student没有实现test这个方法");

            }

        }

        return 0;

    }

    On the road。。。
  • 相关阅读:
    元组类型内置方法
    python的两种编程模式
    Python和Python解释器
    异常处理
    文件的三种打开方式
    python解释器的安装
    编程语言的分类
    计算机基础之编程
    linux 安装postgresql
    CentOS7 部署 gitlab
  • 原文地址:https://www.cnblogs.com/ianhao/p/4426030.html
Copyright © 2011-2022 走看看