OC循环渐进:模拟实现多继承的两种方式

在Objective-C(OC)中没有直接的多继承支持,但可以通过组合(复合)来模拟实现。本文介绍了通过将类对象作为属性传入的方法,详细阐述了如何创建ClassA、ClassB,并如何构建ClassC以同时继承ClassA和ClassB的特性。
摘要由CSDN通过智能技术生成

OC中没有多继承的概念,那么我们该如何实现多继承呢?

OC中实现多继承主要有以下两种方式:

1.(使用复合的方式)将类对象作为属性传入,步骤如下:

(1)建立ClassA类代码如下:

ClassA.h文件:

#import <Foundation/Foundation.h>

@interface ClassA : NSObject

@property (nonatomic,copy) NSString *name;

- (void)sayHi;

@end

ClassA.m文件:

#import "ClassA.h"

@implementation ClassA

- (void)fun {
    NSLog(@"ClassA .....");
}
@end
(2)建立ClassB类代码如下:

ClassB.h文件如下:

#import <Foundation/Foundation.h>

@interface ClassB : NSObject

@property (nonatomic,assign) NSInteger age;

- (void)fun;

@end
ClassB.m文件如下:

#import "ClassB.h"

@implementation ClassB

- (void)sayHi {
    NSLog(@"ClassB sayHi...");
}

@end
(3)模拟ClassC类同时继承ClassA类和ClassB类:

ClassC.h代码如下:

#import <Foundation/Foundation.h>
@class ClassA;
@class ClassB;
@interface ClassC : NSObject


@property (nonatomic,strong) ClassA *a;
@property (nonatomic,strong) ClassB *b;


@end
ClassC.m代码如下:

#import "ClassC.h"
#import "ClassA.h"
#import "ClassB.h"
@implementation ClassC

- (instancetype)init {
    if (self = [super init]) {
        _a = [[ClassA alloc] init];
        _b = [[ClassB alloc] init];
    }
    return self;
}

@end

main.m文件代码如下:

#import <Foundation/Foundation.h>
#import "ClassC.h"
#import "ClassA.h"
#import "ClassB.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        ClassC *c = [[ClassC alloc] init];
        [c.a sayHi];
        [c.b sayHi];
        c.a.name = @"xiaoming";
        c.b.name = @"xiaohong";
        
        NSLog(@"a.name = %@,b.name = %@",c.a.name,c.b.name);
        
    }
    return 0;
}

测试结果如下:

2015-08-07 17:50:35.999 Demo[31600:214183] ClassA sayHi...
2015-08-07 17:50:36.002 Demo[31600:214183] ClassB sayHi...
2015-08-07 17:50:36.002 Demo[31600:214183] a.name = xiaoming,b.name = xiaohong

2.(使用协议的方式)利用@property,步骤如下:

(1)建立ClassA类代码如下:

ClassA.h文件如下:

#import <Foundation/Foundation.h>
@class ClassA;
@protocol ClassAProtocol <NSObject>

@required

@property (nonatomic,strong) ClassA *classA ;

@end

@interface ClassA : NSObject

@property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *sex;

- (void)sayHi;

@end

ClassA.m文件如下:

#import "ClassA.h"

@implementation ClassA

- (void)sayHi {
    NSLog(@"ClassA method....");
}

@end
(2)建立ClassB类代码如下:
ClassB.h文件如下:

#import <Foundation/Foundation.h>
@class ClassB;
@protocol ClassBProtocol <NSObject>

@property (nonatomic,strong) ClassB *classB;

@end

@interface ClassB : NSObject

@property (nonatomic,assign) NSInteger age;
- (void)sayHi;

@end

ClassB.m文件如下:

#import "ClassB.h"

@implementation ClassB

- (void)sayHi {
    NSLog(@"ClassB menthod...");
}

@end

(3)模拟ClassC类同时继承ClassA类和ClassB类:

ClassC.h代码如下:

#import <Foundation/Foundation.h>
#import "ClassB.h"
#import "ClassA.h"
@interface ClassC : NSObject <ClassAProtocol,ClassBProtocol>

@end

ClassC.m代码如下:
#import "ClassC.h"

@implementation ClassC
@synthesize classA = _classA,classB = _classB;

- (id)init {
    if (self = [super init]) {
        self.classB = [[ClassB alloc] init];
        self.classA = [[ClassA alloc] init];
    }
    return self;
}
@end

main.c文件如下:

#import <Foundation/Foundation.h>
#import "ClassA.h"
#import "ClassB.h"
#import "ClassC.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        ClassC *c = [[ClassC alloc] init];
        [c.classB sayHi];
        [c.classA sayHi];
        c.classA.name = @"xiaohong";
        c.classB.age = 15;
        NSLog(@"classA.name = %@,classB.age = %ld",c.classA.name,c.classB.age);   
    }
    return 0;
}

测试结果如下:

2015-08-07 18:00:55.508 Homework_01[32207:220311] ClassB menthod...
2015-08-07 18:00:55.509 Homework_01[32207:220311] ClassA method....
2015-08-07 18:00:55.509 Homework_01[32207:220311] classA.name = xiaohong,classB.age = 15

以上就是在OC中模拟实现多继承的两种方式。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值