小白学开发(iOS)OC_ protocol(协议) (2015-08-09)

时间:2021-03-06 10:11:42

//

//  main.m

//  protocol(协议)

//

//  Created by admin on 15/8/12.

//  Copyright (c) 2015 admin. All rights reserved.

//


#import <Foundation/Foundation.h>

#import "Person.h"

#import "Student.h"

/*

  1. 什么是协议:

    >  协议实际上是一种向上抽象的思想

    >  协议只是做一些共有方法的声明,不做实现,哪个类使用,则哪个类自己实现

 

  2. 协议的使用方式:

    >  建立协议:添加protocol文件,一般命名上要加Protoclo字段

    >  使用协议:需要使用的协议的类在.h文件中先import引入,再在类名后添加 <协议名>,再在.M文件中实现方法

 

  3. 注意:

    >  一个类中可以使用多个协议,<协议1,协议2,。。。>

    >  协议本身也可以遵循其他协议,NSObject是一个基础协议,协议也可以同时遵循多个其他协议

    >  在类的继承中,父类遵循的协议,子类同样遵循(即:当通过子类对象调用协议中方法时,先在子类实现中找,找不大则会在父类实现中找)

    >  一个类特有的协议我们可以把它直接在这个类的.h文件中直接声明出来写在@interface之前,.m文件中实现

    >  协议中的方法有必须实现(@required)的和可选择实现(@optional)的,分别用括号中的关键字区分

    >  协议中只能定义方法,不能定义变量

 

  4. 声明一个需要遵循某个协议的变量

    > 局部变量: Person < 协议名 > *p = [[Person alloc]init];

    > 成员变量: @property(nonatomic,strong) Car<协议名> *car

  */



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

    @autoreleasepool {

       Person *p = [[Personalloc]init];

        [preading];

        [psong];

       Student *s = [[Studentalloc]init];

        [s reading];   //  子类调用类父类中实现的协议的方法

        [ssong];

        

        [s taoke]; //  调用学生类中特有协议的方法

        // 定义一个需要遵循StudentProtocol的变量

        Person<StudentProtocol> *p1 = [[Personalloc]init];

    }

   return 0;

}

//

//  Person.h

//  OC的特有语法

//

//  Created by admin on 15/8/12.

//  Copyright (c) 2015 admin. All rights reserved.

//


#import <Foundation/Foundation.h>

#import "StudentProtocol.h"// 引入协议文件

#import "TeacherProtocol.h"


@interface Person :NSObject <StudentProtocol,TeacherProtocol>

 // 定义一个需要遵循StudentProtocol的变量

@property (nonatomic,strong)NSString<StudentProtocol> *name;

// 定义一个需要遵循TeacherProtocol的变量

@property (nonatomic,assign)id<TeacherProtocol> obj;


@end


//

//  Person.m

//  OC的特有语法

//

//  Created by admin on 15/8/12.

//  Copyright (c) 2015 admin. All rights reserved.

//


#import "Person.h"

//  实现协议中的方法

@implementation Person


- (void)listen

{

    NSLog(@"学生要听课");

}

- (void)reading

{

    NSLog(@"学生要读书");

}

-(void)play

{

   NSLog(@"学生要玩");

}

- (void)teach

{

    NSLog(@"老师要传道授业解惑");

}

-(void)care

{

    NSLog(@"老师要关心学生");

}

-(void)song    // 这是TeacherProtocol协议中一个选择实现的方法

{

    NSLog(@"老师最好会唱歌");

}

@end


//

//  StudentProtocol.h

//  OC的特有语法

//

//  Created by admin on 15/8/12.

//  Copyright (c) 2015 admin. All rights reserved.

//


#import <Foundation/Foundation.h>


@protocol StudentProtocol <NSObject>


@required

- (void)listen;

- (void)reading;

- (void)play;


@optional

- (void)dajia;


@end


//

//  TeacherProtocol.h

//  OC的特有语法

//

//  Created by admin on 15/8/12.

//  Copyright (c) 2015 admin. All rights reserved.

//


#import <Foundation/Foundation.h>


@protocol TeacherProtocol <NSObject>


@required

- (void)teach;

- (void)care;

@optional

- (void)song;


@end


//

//  TeacherProtocol.h

//  OC的特有语法

//

//  Created by admin on 15/8/12.

//  Copyright (c) 2015 admin. All rights reserved.

//


#import <Foundation/Foundation.h>


@protocol TeacherProtocol <NSObject>


@required

- (void)teach;

- (void)care;

@optional

- (void)song;


@end


//

//  Student.h

//  OC的特有语法

//

//  Created by admin on 15/8/12.

//  Copyright (c) 2015 admin. All rights reserved.

//


#import "Person.h"

@protocol StuProtocol<NSObject>


- (void)taoke;


@end


@interface Student :Person <StuProtocol>


@end


//

//  Student.m

//  OC的特有语法

//

//  Created by admin on 15/8/12.

//  Copyright (c) 2015 admin. All rights reserved.

//


#import "Student.h"


@implementation Student


- (void)taoke

{

    NSLog(@"学生逃课,这个是学上类特有的协议");

}


@end