iOS 不支持多繼承,實現多繼承的4種方式

classA 實現了methodA ?方法 ?classB 實現了 methodB 方法 ? classC 要同時實現methodA和methodB方法 在C++ 中用多繼承就能實現,但是Objective c 不支持多重繼承,只支持單繼承那如何實現。

方法1. 組合方式,用ClassC ?添加ClassA ,ClassB成員變量 來調用methodA,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];

}

方法2.協(xié)議protocol ?設置ClassA?delegate和 ClasssB delegate 以及實現方法ClassA里的methodA,和ClasssB里的methodB。ClassC遵守這兩個協(xié)議就可以。【協(xié)議支持多繼承】

方法3.類別(分類)

ClassC的類別 可以實現ClassA的methodA和ClassB的methodB兩個方法,這樣ClassC就可以調用methodA和methodB

方法4.消息轉發(fā)機制

我們知道objective-c中調用方法的方式是發(fā)消息,那如果給一個實例對象發(fā)一個未定義的消息呢?結果就是crash,其實這中間系統(tǒng)給我們第二次機會,就是可以轉發(fā)該消息

如果未調到定義的消息,runtime會給該實例第二次機會,首先調用methodSignatureForSelector 或去方法簽名,然后調用forwardInvocation,如果用戶自己定義的類,沒有重寫這兩個方法,即不支持方法轉發(fā)

@interface?LOCBird?:?NSObject?{??

????NSString*?name_; ?

}??

@end??

@implementation?LOCBird ?

-?(id)init ?

{??

????self?=?[super?init];??

if?(self)?{??

name_?=?[[NSString?alloc]?initWithString:@"I?am?a?Bird!!"];??


????}??

return?self;??

}??


-?(void)dealloc??

{??

????[name_??release];??

????[super?dealloc];??

}??


-?(NSMethodSignature?*)methodSignatureForSelector:(SEL)aSelector??

{??

????NSMethodSignature*?signature?=?[super?methodSignatureForSelector:aSelector];??

if?(signature==nil)?{??

????????signature?=?[name_?methodSignatureForSelector:aSelector];??

????}??

????NSUInteger?argCount?=?[signature?numberOfArguments];??

for?(NSInteger?i=0?;?i

NSLog(@"%s"?,?[signature?getArgumentTypeAtIndex:i]);??

????}??

NSLog(@"returnType:%s?,returnLen:%d"?,?[signature?methodReturnType]?,?[signature?methodReturnLength]);??

NSLog(@"signature:%@"?,?signature);??

return?signature;??

}??


-?(void)forwardInvocation:(NSInvocation?*)anInvocation??

{??

NSLog(@"forwardInvocation:%@"?,?anInvocation);??

????SEL?seletor?=?[anInvocation?selector];??

if?([name_?respondsToSelector:seletor])?{??

????????[anInvocation?invokeWithTarget:name_];??

????}??


}??


@end ?

?多繼承消息轉發(fā)原理就是 ?ClassC 沒法實現methodA 和methodB 但是有成員變量ClassA 實力和ClassB實例??梢栽谟肅lassC調用methodA 和methodB方法的時候消息轉發(fā)給對應的實例就不會導致crash。其實和1組合方式類似。

主要參考鏈接:

http://blog.csdn.net/freshforiphone/article/details/7381329

轉載:https://blog.csdn.net/Asia_ZhangQQ/article/details/70224940

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容