您的位置:首页 > 移动开发 > IOS开发

iOS开发:oc中实现多继承

2016-05-25 21:27 363 查看
OC无法完全像C++使用多继承。

方法一:采用组合的模式来代替继承模式。

实现多继承的代码:
举例现在ClassC需要继承ClassA中methodA、ClassB中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];

}

方法二:

上面是采用组合的方式实现了多继承的功能,解决了OC不能多继承的语法。那么还有其他的方式来实现多继承吗?

虽然OC在语法上禁止类使用多继承,但是在协议的遵守上却允许使用多继承。所以可以用协议来实现多继承。但是协议只能提供接口,而没有提供实现方式,如果只是想多继承基类的接口,那么遵守多协议无疑是最好的方法,而既需要多继承接口,又要多继承其实现,那么协议是无能为力了。多协议遵守比较简单,具体的实现方式这里就不讲了
#import <Foundation/Foundation.h>

@protocol Add <NSObject>
- (int)addA:(int)a b:(int)b;
@end

#import <Foundation/Foundation.h>

@protocol Sub <NSObject>
- (int)subA:(int)a b:(int)b;
@end

#import <Foundation/Foundation.h>

@protocol Mul <NSObject>
- (int)mulA:(int)a b:(int)b;
@end
==================================================以上是三个协议
下面是新建一个继承与NSObject的计算类Calculator
#import <Foundation/Foundation.h>
#import "Add.h"
#import "Sub.h"
#import "Mul.h"

//遵守多个协议
//类似于c++的多继承
@interface Calculator : NSObject <Add,Sub,Mul>

@end

#import "Calculator.h"

@implementation Calculator
- (int)addA:(int)a b:(int)b {
return a+b;
}
- (int)subA:(int)a b:(int)b {
return a-b;
}
- (int)mulA:(int)a b:(int)b {
return a*b;
}
@end
==========================================
#import <Foundation/Foundation.h>
#import "Calculator.h"

/*
现在有多个类,一个是加法器类(会算加法) 第二个类是减法器类(减法功能)第三个乘法器类(乘法)

实现一个类分别可以进行 + - *

c++可以用多继承实现

但是OC没有多继承 但是OC可以通过协议来实现
*/

int main(int argc, const char * argv[]) {
@autoreleasepool {
Calculator *calc = [[Calculator alloc] init];

NSLog(@"%d",[calc addA:1 b:1]);//2
NSLog(@"%d",[calc subA:1 b:1]);//0
NSLog(@"%d",[calc mulA:1 b:1]);//1
}
return 0;
}


方法三:给NSObject添加category
因为NSObject是所有类的父类,给NSObject添加类别就相当于给所有的类添加了这些方法,所有的类都可以使用这些方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios开发