您的位置:首页 > 移动开发 > Objective-C

objective-c自学总结(三)---面向对象的封装,继承与多态

2015-05-22 12:28 417 查看

面向对象的三大特性

封装

继承

多态

1.封装:

隐藏属性,方法或实现细节的过程称为封装

信息隐藏,隐藏对象的实现细节,不允许用户看到 将东西包装在一

然后以新的完整形式呈现出来 例如,两种或多种化学药品组成一个胶囊

将方法和属性一起包装到一个单元中,单元以类的形式实现 对象同时具有属性和方法两项特性

对象的属性和方法通常被封装在一起,共同体现事物的特性,二者相辅相成,不能分割

2继承:

2.1继承的定义:

A是B

如果这句话能说得通,在设计程序的时候就可以看成是继承关系

子类具有父类的一般特性(包括属性和行为),以及自身特殊的特性

为什么要用继承:观察下面两段代码

//卡车类
@interface Truck : NSObject
{
// 品牌
NSString *_brand;

//颜色
NSString *_color;
float _maxWeight;
}

-(id)initWithlamp:(float)wattage;
//启动
-(void)star;
//刹车
-(void)stop;
@end


//出租车类
@interface Taxi : NSObject
{
// 品牌
NSString *_brand;

//颜色
NSString *_color;
float _company;
}
-(id)initWithengine:(NSString*)model  Withcapacity:(NSInteger)capacity;
//启动
-(void)star;
//刹车
-(void)stop;
@end


代码存在很明显的重复现象

如何改进?有没有可能建立继承关系让子类自动继承父类的属性和方法?

定义一个通用的类,他有基本的实例变量。子类只要继承了该类,就可以拥有这些实例变量。子类也可以定义自己的实例变量。

被继承的类叫超类或父类,继承父类的类叫子类或派生类。

OC中继承的语法规则为:

@interface 子类 : 父类

子类自动继承父类的属性和方法

改进如下

//车类
@interface Car : NSObject
{
// 品牌
NSString *_brand;

//颜色
NSString *_color;
}
//启动
-(void)star;
//刹车
-(void)stop;
@end


//卡车类
@interface Truck : NSObject
{
float _maxWeight;
}

-(id)initWithlamp:(float)wattage;
@end


//出租车类
@interface Taxi : NSObject
{
float _company;
}
-(id)initWithengine:(NSString*)model  Withcapacity:(NSInteger)capacity;
@end


这样就很好的避免了代码的重复编写。

2.2:再谈self/super

2.2.1:再谈self

使用self优先调用当前类的方法

当前类如果没有则调用父类。

2.2.1:再谈super

super关键字可以调用从父类继承下来的方法

@implementation Worker
-(id)init{
self=[super init];
if(self)
{

}
return self;
}


2.3:方法重写

通过方法的重写,子类可以改变从父类继承的行为

被重写的方法定义必须与父类中的方法完全一样。

//父类的方法
-(void)work
{
NSLog(@"人开始干活");
}


//子类重写的方法
-(void)work
{
NSLog(@"学生开始学习");
}


3.多态:

下面来看一组代码

//父类
@implementation Paint
-(void)paintf
{
NSLog(@"打印机打印");
}
@end


//子类(重写)
@implementation blackPrint
-(void)paintf
{
NSLog(@"黑白");
}
@end


//子类(重写)
@implementation colorPaint
-(void)paintf
{
NSLog(@"彩色");
}
@end


#import "Person.h"

@implementation Person
//使用彩色打印机
-(void)paintWithColor:(colorPaint*)paint
{
[paint paintf];
}
//使用黑白打印机
-(void)paintWithBlack:(blackPrint*)paint
{
[paint paintf];
}
@end


可以看出来每次增加一个打印机,都要在Person类中增加相应的打印方法,代码的课扩展性和可维护性极差。

这样我们就可以利用多态来解决。

多态是指同一种类型具有多种表现形态。

也就是说不同的子类继承同一个父类这些子类可以看做是同一类型,子类覆盖父类的方法,每个子类实现的功能不相同,这就是多态。

多态的条件

必须存在继承关系

子类重写父类的方法

父类声明的变量指向子类对象

paint*color=[[colorPaint alloc] init];
paint*black=[[blackPrint alloc] init];


解决方法

@implementation Persion
-(void)doPaint:(Paint*)paint
{
[paint paintf];
}


使用多态后,当需要增加新的子类类型时,无需更改Person类,程序的可扩展性和可维护性增强。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐