首先,object-c不能够多继承,那么有没有其他方式替代?有,一种是伪继承,另一种是@protocol委托方式来实现
1、伪继承
尽管在object-c中不再提供多继承,但它提供了另外一种解决方案,使对象可以响应在其他类中实现的消息,这种方案叫做消息转发,它可以使一个类响应另外一个类中实现的消息
在一般情况下,发送一个无法识别的消息会产生一个运行时的错误,导致应用程序崩溃,但是注意,在崩溃之前,iphone运行时对象为每个对象提供了第二次机会来处理消息。捕捉到一条消息后可以把它重定向到可以响应该消息的对象。
这个功能完全通过消息转发来实现,发送消息给一个无法处理该选择器的对象时,这个选择器就会被转发给forwardInvocation方法,接受这条消息的对象,用一个NSInvocation的实例保存原始的选择器和被请求的参数。所以,我们可以覆盖forwardInvocation方法,并把消息转发给另外一个对象。
1.1 实现消息转发功能
在程序添加消息转发功能以前,必须覆盖两个方法,即methodSignatureForSelector:和forwardInvocation:。methodSignatureForSelector:的作用在于为另一个类实现的消息创建一个有效的方法签名。forwardInvocation:将选择器转发给一个真正实现了该消息的对象。
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
{
NSMethodSignature* signature = [super methodSignatureForSelector:Selector];
if(!signature)
signature = [self.carinfo methodSignatureForSelector:selector];
return signature;
}
- (void)forwardInvocation:(NSInvocation *)invocation
{
SEL selector = [invocatio selector];
if([self.carinfo respondsToSelector:selector])
{
[invocation invokeWithTarget:sellf.carinfo];
}
}
2、委托
在IOS中委托通过一种@protocol的方式实现,所以又称为协议。协议是多个类共享的一个方法列表。在协议中所列出的方法没有响应的实现。