OC协议-正式协议的定义

Object-C技术学习,更多资源请访问 https://www.itkc8.com

//  main.m

//  正式协议的定义

//

//  Created by Goddog on 15/1/11.

//  Copyright (c) 2015年 Goddog. All rights reserved.

//

/*

    1.正式协议的定义不再采用@interface、@implementation关键字,而是使用@protocol关键字,

      如@protocol 协议名 <父协议1,父协议2> {零到多个方法定义...}

    2.协议的具体要求:(1)协议名应该与类名采用相同的命名规则。

                   (2)一个协议可以有多个直接父协议,但协议只能继承协议,不能继承类。

                   (3)协议中定义的方法只有方法的签名,没有方法的实现,协议中的方法可以是类方法,也可以是实例方法。

    3.协议的继承与类的继承不一样,协议完全支持多继承,即一个协议可以有多个直接的父协议。

    4.遵守协议:在类定义的接口部分可指定该类继承的父类,以及遵守的协议,语法为@interface 类名:父类<协议1,协议2...>

    5.使用协议定义变量的方法:(1)NSObject<协议1,协议2...>* 变量;

                          (2)id<协议1,协议2...> 变量;

    6.如果使用协议来定义变量,那么这些变量只能调用该协议中声明的方法,否则编译错误。

    7.正式协议与非正式协议:  (1)非正式协议用NSObject创建类别来实现,而正式协议则用@protocol创建。

                    (2)遵守非正式协议通过继承带特定类别的NSObject来实现,而遵守正式协议有专门的OC语法。

                    (3)遵守非正式协议不要求实现协议中定义的所有方法,遵守正式协议必须实现协议中定义的所有方法。

    8.但是从OC2.0开始增加了:(1)@optional:实现类即可选择实现这些方法,也可选择不实现这些方法。

                         (2)@required:实现类必须实现这些方法。

    9.有了@optional和@required关键字之后,正式协议完全可以替代非正式协议。

 */

//
//  Women.h
//  正式协议的定义
//
//  Created by Goddog on 15/1/11.
//  Copyright (c) 2015年 Goddog. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol Women <NSObject>
//定义协议的方法
@optional   //可以不实现该接口的方法
-(void) pretty;
@required   //必须实现该接口的方法
-(void) beautiful:(NSString*) count;
@end

 

//
//  Man.h
//  正式协议的定义
//
//  Created by Goddog on 15/1/11.
//  Copyright (c) 2015年 Goddog. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol Man <NSObject>
//定义协议的方法
-(void) handsome;
@end

 

//
//  Person.h
//  正式协议的定义
//
//  Created by Goddog on 15/1/11.
//  Copyright (c) 2015年 Goddog. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Women.h"
#import "Man.h"

//协议继承了Women、Man协议
@protocol Person <Women,Man>
//定义协议的方法
-(NSString*) play;
@end

 

//
//  SuperMan.h
//  正式协议的定义
//
//  Created by Goddog on 15/1/11.
//  Copyright (c) 2015年 Goddog. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"

@interface SuperMan : NSObject<Person>  //实现Person的协议

@end

 

//
//  SuperMan.m
//  正式协议的定义
//
//  Created by Goddog on 15/1/11.
//  Copyright (c) 2015年 Goddog. All rights reserved.
//

#import "SuperMan.h"
#define MAX_CACHE_LINE 10

@implementation SuperMan
{
    NSString* playData[MAX_CACHE_LINE];   //使用数组记录所有需要缓存的数据
    int dataNum;     //记录当前的数量
}

//实现协议方法
-(void) pretty
{
    //只要还有漂亮的,继续上
    while (dataNum > 0) {
        NSLog(@"正在和%@玩%@",playData[0],[self play]);
        //剩下的人数减少
        dataNum --;
        //把列队整体向前移
        for (int i = 0; i < dataNum; i++) {
            playData[i] = playData[i + 1];
        }
    }
}

//实现协议方法
-(void) beautiful:(NSString *)count
{
    if (dataNum >= MAX_CACHE_LINE) {
        NSLog(@"人数已满,不要在上了!");
    }
    else
    {
        //把人数添加到列队中
        playData[dataNum++] = count;
    }
}

//实现协议方法
-(void) handsome
{
    NSLog(@"英俊");
}

//实现协议方法
-(NSString*) play
{
    
    return @"游戏";
}

@end

 

#import <Foundation/Foundation.h>
#import "SuperMan.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
            //创建超人对象
        SuperMan* superMan = [[SuperMan alloc] init];
        //调用协议的方法
        [superMan beautiful:@"乌克兰美女"];
        [superMan beautiful:@"白俄罗斯美女"];
        [superMan pretty];
        [superMan handsome];
        
        //创建超人对象,当成Man使用
        NSObject<Man>* man = [[SuperMan alloc] init];
        //调用Man协议中定义的方法
        [man handsome];
        
        //创建超人对象,当成Women使用
        id<Women> women = [[SuperMan alloc] init];
        //调用Women协议中定义的方法
        [women beautiful:@"俄罗斯美女"];
        [women pretty];
        //[women handsome];//这样是不能调用的
    }
    return 0;
}

Object-C技术学习,更多资源请访问 https://www.itkc8.com

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值