我們都知道Objective-C不能像C++一樣支持多繼承,但是在Objective-C的使用經常會碰到需要使用多繼承的情況。例如,ClassA中有methodA,ClassB中methodB,而現在需要使用這兩個類中的方法。如何按照C++的編程思路,毫無疑問采用多繼承就搞定了,在Objective-C就需要動動腦子了。
其實我們在學習設計模式的時候知道,多繼承的效率不高,而且采用組合的模式可以完全代替繼承模式。那麼,這種思路完全可以用在Objective-C中實現多繼承(或許Objective-C拋棄多繼承,就是強迫我們使用更高效的組合設計模式吧!)。下面用實際的代碼來表示組合如何來代替多繼承。
現在ClassC需要繼承ClassA中methodA、ClassB中methodB,具體的代碼實現為:
//定義ClassA以及其methodA
@interface ClassA : NSObject {
}
-(void)methodA;
@end
//定義ClassB以及其methodB
@interface ClassB : NSObject {
}
-(void)methodB;
@end
//定義ClassC以及其需要的methodA,methodB
@interface ClassC : NSObject {
ClassA *a;
ClassB *b;
}
-(id)initWithA:(ClassA *)A b:(ClassB *)B;
-(void)methodA;
-(void)methodB;
@end
//注意在ClassC的實現
@implementation ClassC
-(id)initWithA:(ClassA *)A b:(ClassB *)B{
a=[[ClassA alloc] initWithClassA: A];//[A copy];
b=[[ClassB alloc] initWithClassB: B];//[B copy];
}
-(void)methodA{
[a methodA];
}
-(void)methodB{
[b methodB];
}
上面是采用組合的方式實現了多繼承的功能,解決了Objective-C不能多繼承的語法。那麼還有其他的方式來實現多繼承嗎?
雖然Objective-C在語法上禁止類使用多繼承,但是在協議的遵守上卻允許使用多繼承。所以可以用協議來實現多繼承。但是協議只能提供接口,而沒有提供實現方式,如果只是想多繼承基類的接口,那麼遵守多協議無疑是最好的方法,而既需要多繼承接口,又要多繼承其實現,那麼協議是無能為力了。多協議遵守比較簡單,具體的實現方式這裡就不講了!