OC学习3
面向对象的三大基本特征
1.封装:隐藏内部实现,稳定外部接口
属性封装了实例变量
方法封装了具体实现的代码
类封装了属性和方法
好处:
使用起来更加简单
变量更加安全
可以隐藏内部实现细节
开发速度更加快捷
2.继承
为什么要使用继承?
2.1. 在开发过程中,我们会发现很多相同的代码,特别是创建一些类的时候,发现类与类之间有很多的属性及方法,这些方法和属性会写 很多次,如果程序员这样干 ,就显得很low了.在面向对象中,有继承的概念,我们可以使用继承方式将相同的属性和方法放到一 个类中,然后其它类继承子类,我们将这种方式叫做继承.
2.2. 继承即是让一个类拥有另外一个类的某些属性和方法的特性,被继承的类称为父类(基类),继承类称为子类.子类可以直接拥有父 类中的所有非私有属性和方法.
什么时候使用继承?
在开发中发现一些具有相同的特征和方法,我们使用继承.
在OC中只有单继承的概念,并没有多继承,那么问题来了,OC中如何实现多继承?(note:不要使用协议)
- 1.协议
- 2.在这第二个方法当中,比较重要的就是,我们要在子类C中重写init方法.在重写的init方法中,对父类A与B进行实例化.
- `-(id)init{
if(self = [super init]){
_a = [A new];
_b = [B new];
}
return self;
}`
PS:以下是多继承的代码
1. A.h
#import <Foundation/Foundation.h>
@interface A : NSObject
@property (nonatomic,strong) NSString *aproperty;
-(void)methodA;
@end
- A.m
#import "A.h"
@implementation A
-(void)methodA{
NSLog(@"methodA");
}
@end
- B.h
#import <Foundation/Foundation.h>
@interface B : NSObject
@property (nonatomic,strong) NSString *bproperty;
-(void)methodB;
@end
- B.m
#import "B.h"
@implementation B
-(void)methodB{
NSLog(@"methodB");
}
@end
- C.h
#import <Foundation/Foundation.h>
#import "A.h"
#import "B.h"
@interface C : NSObject
@property (nonatomic,strong) A *a;
@property (nonatomic,strong) B *b;
@end
- C.m
#import "C.h"
@implementation C
-(id)init{
if(self = [super init]){
_a = [A new];
_b = [B new];
}
return self;
}
//+(void)load{
// NSLog(@"%@",load);
//}
-(NSString *)description{
return @"我是这个类的描述.";
}
@end
- main.m
#import <Foundation/Foundation.h>
#import "C.h"
int main(int argc, const char * argv[])
{
@autoreleasepool{
C *c = [C new];
c.a.aproperty = @"xxx";
c.b.bproperty = @"yyy";
[c.a methodA];
[c.b methodB];
}
return 0;
}