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中模拟实现多继承的两种方式。