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