//
// 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