OC语法<3.3> OC中特有的语法:Protocol协议

Protocol协议:                                                                                                                                                               


1:协议其实很简单,协议就是规定,谁遵循了我的协议,谁就能够指向我,比如说,小明实现了好人协议,那么小明就是一个好人

 2:协议本身只是提供方法的声明,并不实现方法,谁遵循了协议,谁就要实现协议中定义的方法(跟java中的抽象方法有点类似,都是一些共有的属性),说白了协议里面就是一堆方法的声明,等着类引用去实现

 3:一个类可以同时遵循多个协议

 4:协议本身也可以遵循其他协议(可以多个),NSObject是一个基础协议

 5:父类遵循了那些协议,子类同样遵循那些协议

 6:协议也可以再.m文件中临时加,但是只能自己用,当然也要实现当中的方法,这种情况一般都是不需要许多的类去遵循的协议,也就是一个类所特有的协议

 7:协议跟分类有点相似,协议当中也不能够声明成员变量,实际开发当中,也是先写协议后写类的

一:创建一个Protocol     

 创建一个protocol协议跟category差不多, 也是在 Objective-C File 里面

二:实例应用  

 我们创建三个协议:流氓协议,Person协议,学生协议

 流氓协议:

#import <Foundation/Foundation.h>
#import "StudentProtocol.h"
//谁遵循了协议,谁就要实现协议中定义的方法,协议本身只提供方法的声明,并不实现方法
//协议本身也可以遵循其他协议,NSObject是一个基础协议
@protocol LiuMangProtocol <NSObject,StudentProtocol>

//协议就是方法
@required  //这个关键字代表下面的方法必须实现
-(void)eat;  //吃
-(void)drink; //喝

@optional    //这个方法代码可选实现
-(void)gamble; //赌
-(void)lie;    //撒慌
@end

学生协议:

#import <Foundation/Foundation.h>

@protocol StudentProtocol <NSObject>

-(void)listener;
-(void)write;

@end
student协议:

#import <Foundation/Foundation.h>

@protocol StudentProtocol <NSObject>

-(void)listener;
-(void)write;

@end


我们创建一个对象Person来实现流氓协议和Person协议,当然必须要实现协议里面所有的方法(@required 必须实现的方法,@optional可选实现的借口);

Person的.h

#import <Foundation/Foundation.h>
#import "LiuMangProtocol.h"
#import "PersonProtocol.h"
#import "Car.h"
#import "CarProtocol.h"
//一个类可以同时遵循多个协议
//遵守哪个协议就要写在下面的< >中
@interface Person : NSObject<LiuMangProtocol,PersonProtocol>
//让Car遵循CarProtocol协议
@property(nonatomic,strong)Car<CarProtocol> *car;
//下面这种也行
@property(nonatomic,strong)id <CarProtocol> obj;
@end

Person的.m:实现各个协议的方法

#import "Person.h"

@implementation Person

-(void)eat
{
    NSLog(@"流氓吃鸡蛋不吐葡萄皮");
}

-(void)drink
{
    NSLog(@"流氓喝酒不给钱");
}

-(void)gamble
{
    NSLog(@"流氓赌博老输钱");
}

-(void)lie
{
    NSLog(@"流氓撒谎如放屁");
}

-(void)walk
{
    NSLog(@"正常人走路");
}

-(void)listener
{
    NSLog(@"学生听课");
}
-(void)write
{
    NSLog(@"学生写字");
}

@end

我们创建一个 middleStudent 的类来继承 Person类,父类遵循了那些协议,子类同样遵循那些协议,只不过父类帮我们实现好了,我们拿过来用就行,当然middleStudent也可以创建自己私有的协议 ,如下

middleStudent 的.m文件

#import "Person.h"

//一个类的私有协议,也就是不需要许多类去遵守的协议,一个类特有的协议,我们可以把它直接再这个类的.h文件中直接声明出来,如下
@protocol middleStudentProtocol <NSObject>

-(void)sleep;

@end
//父类遵循了那些协议,子类同样遵循了那些协议
@interface middleStudent : Person<middleStudentProtocol>


@end
middleStudent 的.h文件,如果重写父类飞方法,那么会覆盖掉父类的方法

#import "middleStudent.h"

@implementation middleStudent

-(void)listener
{
    NSLog(@"重写父类方法的学生听课");
}
-(void)sleep
{
    NSLog(@"中学生特有的协议,睡觉");
}
@end
main函数

#import <Foundation/Foundation.h>
#import "Person.h"
#import "middleStudent.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {

        //创建一个person
        Person *p = [[Person alloc]init];
        [p eat];
        [p drink];
        [p walk];
        
        //创建一个中学生
        middleStudent *mid = [[middleStudent alloc]init];
        [mid eat];
        [mid listener];
        
        //协议还有一种简便的书写方式,便于查看
        //遵循协议的变量声明
        //要求你创建的Person对象必须是遵循了personProtocol
        //如果Person中没有实现PersonProtocol那么编译就会报错
        Person<PersonProtocol> *p2 = [[Person alloc]init];
        //下面这种方式也行,id,万能指针类型,能够存储任何的对象类型
        id<PersonProtocol> obj = [[Person alloc]init];
        
    }
    return 0;
}

测试结果:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值