不同于C++
擁有強(qiáng)大的多繼承
特性钝腺,OC
只支持單繼承
躏啰,但是OC
真的就放棄了如此強(qiáng)大的多繼承
特性了么?答案是否定的雹拄。
雖然在語(yǔ)法上OC
不支持多繼承
,但是OC
提供了另外的方法間接實(shí)現(xiàn)類(lèi)的多繼承
OC實(shí)現(xiàn)多繼承的途徑掌呜。
舉例:ClassA滓玖,ClassB,ClassC 三個(gè)類(lèi)质蕉,ClassC繼承ClassA和ClassB势篡。
- 通過(guò)組合的方式實(shí)現(xiàn)多繼承
這種方式最簡(jiǎn)單粗暴,在子類(lèi)
中創(chuàng)建父類(lèi)對(duì)象
模暗,外部調(diào)用時(shí)讓父類(lèi)對(duì)象
去調(diào)用父類(lèi)方法
禁悠,從而實(shí)現(xiàn)多繼承
。
#import "ClassC.h"
#import "ClassA.h"
#import "ClassB.h"
@interface ClassC ()
@property (nonatomic, strong) ClassA *a;
@property (nonatomic, strong) ClassB *b;
@end
@implementation ClassC
- (instancetype)init {
self = [super init];
if (self) {
_a = [[ClassA alloc]init];
_b = [[ClassB alloc]init];
}
return self;
}
- (void)classCMethod{
NSLog(@"調(diào)用了classCMethod");
}
- (void)classBMethod {
NSLog(@"調(diào)用了classBMethod");
}
- (void)classAMethod {
NSLog(@"調(diào)用了classAMethod");
}
// 調(diào)用
ClassC *c = [[ClassC alloc]init];
[c classAMethod];
// 打印結(jié)果
調(diào)用了classAMethod
- 通過(guò)協(xié)議實(shí)現(xiàn)多繼承
因?yàn)?code>OC允許一個(gè)類(lèi)遵守多個(gè)協(xié)議
兑宇,所以我們可以通過(guò)協(xié)議
的方式模擬多繼承
碍侦。但是協(xié)議
只能提供接口
,不能提供實(shí)現(xiàn)
隶糕,所以我們需要在子類(lèi)
中添加對(duì)應(yīng)的實(shí)現(xiàn)
瓷产,這也注定了協(xié)議
實(shí)現(xiàn)多繼承
是不完美的。
// ClassA.h
@protocol ClassADelegate <NSObject>
- (void)classAMethod;
@end
// ClassB.h
@protocol ClassBDelegate <NSObject>
- (void)classBMethod;
@end
// ClassC.h
#import "ClassA.h"
#import "ClassB.h"
@interface ClassC : NSObject <ClassADelegate,ClassBDelegate>
- (void)classCMethod;
@end
// ClassC.m
- (void)classCMethod{
NSLog(@"調(diào)用了classCMethod");
}
- (void)classBMethod {
NSLog(@"調(diào)用了classBMethod");
}
- (void)classAMethod {
NSLog(@"調(diào)用了classAMethod");
}
// 調(diào)用
ClassC *c = [[ClassC alloc]init];
[c classAMethod];
// 打印結(jié)果
調(diào)用了classAMethod
3.通過(guò)分類(lèi)Category實(shí)現(xiàn)多繼承
具體可見(jiàn)我的另一篇文章 分類(lèi)Category & 擴(kuò)展 Extension