實現(xiàn)多繼承(protocol+消息轉(zhuǎn)發(fā))

創(chuàng)建類father、mom、son, son繼承于father、mom

father

#import <Foundation/Foundation.h>

@protocol fatherDelegate <NSObject>
-(void)driver;
@end

@interface father : NSObject<fatherDelegate>

@end
#import "father.h"

@implementation father
-(void)driver
{
    NSLog(@"driver");
}
@end

mom

#import <Foundation/Foundation.h>

@protocol momDelegate <NSObject>
-(void)cook;
@end
@interface mom : NSObject<momDelegate>

@end
#import "mom.h"

@implementation mom
-(void)cook
{
    NSLog(@"cook");
}
@end

son

#import <Foundation/Foundation.h>
#import "father.h"
#import "mom.h"

@interface son : NSObject<fatherDelegate,momDelegate>
@end
#import "son.h"
@interface son ()
@property(strong,nonatomic)father * f;
@property(strong,nonatomic)mom * m;
@end
@implementation son
-(instancetype)init
{
    if (self = [super init]) {
        self.f = [[father alloc]init];
        self.m = [[mom alloc]init];
    }
    return self;
}
- (id)forwardingTargetForSelector:(SEL)aSelector
{
    if ([self.f respondsToSelector:aSelector]) {
        return self.f;
    }
    else if ([self.m respondsToSelector:aSelector])
    {
        return self.m;
    }
    else
    {
        return self;
    }
}
//-(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
//{
//    if ([self.f respondsToSelector:aSelector]) {
//        return [self.f methodSignatureForSelector:aSelector];
//    }
//    else if ([self.m respondsToSelector:aSelector])
//    {
//        return [self.m methodSignatureForSelector:aSelector];
//    }
//    else
//    {
//        return nil;
//    }
//}
//- (void)forwardInvocation:(NSInvocation *)anInvocation
//{
//    if ([self.f respondsToSelector:anInvocation.selector]) {
//        [anInvocation invokeWithTarget:self.f];
//    }
//    else if ([self.m respondsToSelector:anInvocation.selector])
//    {
//        [anInvocation invokeWithTarget:self.m];
//    }
//}
@end

在vc中使用son這個類

#import "ViewController.h"
#import "son.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    son * s = [[son alloc]init];
    [s driver];
}


@end

結(jié)果
2019-09-10 11:10:28.611041+0800 測試多繼承[31932:1161314] driver

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容