在OC中不能多继承,但是可以实现多协议。使用协议,让一个类必须(或选择)实现一些方法。
注:category也可以实现类似的作用,因此也叫非正式协议。
我们来实现一个动物协议:
//
// Animal.h
//
//
// Created by hhg on 15-6-15.
// Copyright (c) 2015年 hhg. All rights reserved.
//
#import <Foundation/Foundation.h>
@protocol Animal <NSObject>
@required
/// 动物都会吃东西
- (void)eat;
@optional
- (void)fly;
@end
然后创建一个Dog类,继承动物协议:
//
// Dog.h
//
//
// Created by hhg on 15-6-15.
// Copyright (c) 2015年 hhg. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Animal.h"
@interface Dog : NSObject <Animal>
@end
//
// Dog.m
//
//
// Created by hhg on 15-6-15.
// Copyright (c) 2015年 hhg. All rights reserved.
//
#import "Dog.h"
@implementation Dog
- (void)eat {
NSLog(@"吃骨头");
}
@end
调用:
//
// main.m
//
//
// Created by hhg on 15-6-15.
// Copyright (c) 2015年 hhg. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Dog *dog = [[Dog alloc]init];
[dog eat];
}
return 0;
}
我们可以通过一些方法来判断协议和方法是否被实现
//
// main.m
//
//
// Created by hhg on 15-6-15.
// Copyright (c) 2015年 hhg. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Dog *dog = [[Dog alloc]init];
// 判断是否继承协议
if ([dog conformsToProtocol:@protocol(Animal)]) {
NSLog(@"狗正常的动物");
[dog eat];
} else {
NSLog(@"狗不会吃东西,是外来物种");
}
// 判断是否实现某些方法
if ([dog respondsToSelector:@selector(eat)]) {
NSLog(@"狗会吃东西");
[dog eat];
} else {
NSLog(@"狗不会吃东西,是外来物种");
}
if ([dog respondsToSelector:@selector(fly)]) {
NSLog(@"天哪,狗会飞");
} else {
NSLog(@"狗不会飞,是正常物种");
}
}
return 0;
}