文件列表如下:
main.m为主类
Person.h为协议,也可以理解为接口
Student.h和Student.m为学生类,他遵从协议Person;
Teacher.h和Teacher.m为学生类,他遵从协议Person;
Manager.h和Manager.m为管理者,他有一个成员,此成员必须遵从Person协议;
协议类:
#import <Foundation/Foundation.h>
@protocol Person <NSObject> //关键字protocol表明了Person为协议,或者理解为接口关键字,所有的协议都遵从NSObject
-(void) sayHello;
@end
Student的头文件:
#import "Person.h"
@interface Student:NSObject<Person>
@end
Student的实现文件:
#import "Student.h"
@implementation Student
- (void)sayHello
{
NSLog(@"student say hello");
}
@end
Teacher的头文件:
#import <Foundation/Foundation.h>
#import "Person.h"
@interface Teacher : NSObject<Person>
@end
Teacher的实现文件:
#import "Teacher.h"
@implementation Teacher
-(void)sayHello
{
NSLog(@"teacher say hello");
}
@end
Manager的头文件:
#import <Foundation/Foundation.h>
#import "Person.h"
@interface Manager : NSObject
@property (atomic, strong) id<Person> obj; //属性obj;id为特殊关键字;<Person>为遵从的协议;
-(void) SayHello;
@end
Manager的实现文件:
#import "Manager.h"
@implementation Manager
-(void) SayHello
{
if(_obj != nil)
{
[_obj sayHello];
}
}
@end
main的调用文件:
#import <Foundation/Foundation.h>
#import "Student.h"
#import "Teacher.h"
#import "Manager.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Student *s = [[Student alloc] init];
Teacher *t = [[Teacher alloc] init];
Manager *m = [[Manager alloc]init];
m.obj = s;
//m.obj = t; //或者使用t赋值给m的obj,都可以实现调用SayHello方法。
[m SayHello];
}
return 0;
}
协议相当于接口,可以用作代理模式。什么是代理模式,就是用接口引用具体的实现类。