您的位置:首页 > 其它

OC三大特性之--继承

2015-06-12 14:12 253 查看

1、基本介绍

继承是类中的一个重要的特性,他的出现使得我们没必要别写重复的代码,可重用性很高。当然OC中的继承和Java中是一样的,没多大区别,这里在看一个例子吧:

首先来看一下父类:Car

Car.h

#import

@interface Car : NSObject{
NSString *_brand;
NSString *_color;
}

- (void)setBrand:(NSString *)brand;
- (void)setColor:(NSString *)color;
- (void)brake;
- (void)quicken;

@end


在Car类中定义了两个属性,以及一些方法

Car.m

#import "Car.h"

@implementation Car
- (void)setBrand:(NSString *)brand{
_brand = brand;
}
- (void)setColor:(NSString *)color{
_color = color;
}
- (void)brake{
NSLog(@"刹车");
}
- (void)quicken{
NSLog(@"加速");
}
@end


方法的实现

在来看一下子类:

Taxi.h

#import "Car.h"

@interface Taxi : Car{
NSString *_company;//所属公司
}

//打印发票
- (void)printTick;

@end


看到Taxi类继承了父类Car,这里需要导入父类的头文件,然后在Taxi类中多了一个属性和方法

Taxi.m

#import "Taxi.h"

@implementation Taxi

- (void)printTick{
[super brake];
[self brake];
NSLog(@"%@出租车打印了发票,公司为:%@,颜色为:%@",_brand,_company,_color);
}

@end


对方法的实现,这里我们看到实现文件中是不需要导入父类Car的头文件的,因为可以认为,Taxi.h头文件中已经包含了Car的头文件了。而且,这里可以使用super关键字来调用父类的方法,同时这里我们也是可以用self关键字来调用,这里看到其实这两种方式调用的效果是一样的,当我们在子类重新实现brake方法的时候(Java中的重写概念),那么这时候super关键字调用的还是父类的方法,而self调用的就是重写之后的brake方法了。同样,我们也是可以使用父类中的属性。

再看一下另外一个子类:

Truck.h

#import "Car.h"
//卡车类继承Car
@interface Truck : Car{
float _maxWeight;//最大载货量
}

//覆盖父类的方法brake
//优先调用子类的方法
- (void)brake;

- (void)unload;

@end


这里就自己定义了一个brake方法,这时候就会覆盖父类中的brake方法了。

Truck.m

import "Truck.h"

@implementation Truck

- (void)brake{
[super brake];
NSLog(@"Truck类中的brake方法");
}

- (void)unload{
[super brake];//调用父类的方法
[self brake];//也是可以的
NSLog(@"%@的卡车卸货了,载货量:%.2f,汽车的颜色:%@",_brand,_maxWeight,_color);
}

@end


这里就可以看到,我们会在brake方法中调用一下父类的brake方法,然后在实现我们自己的逻辑代码。

2、继承的其他知识点

1. 继承的专业术语

父类\超类 superclass

子类 subclass\subclasses

2. 继承的细节

单继承

子类和父类不能有相同的成员变量

方法的重写

3. super关键字

分别调用父类的对象方法和类方法

4. 继承的好处

不改变原来模型的基础上,拓充方法

建立了类与类之间的联系

抽取了公共代码

坏处:耦合性强

5. 继承的使用场合

它的所有属性都是你想要的,一般就继承

它的部分属性是你想要的,可以抽取出另一个父类

6.子类方法和属性的访问过程:

如果子类没有,就去访问父类的

父类被继承了还是能照常使用的

父类的静态方法

画继承结构图,从子类抽取到父类

NSObject的引出:全部OC类的最终父类,包含了一些常用方法,比如+new

3、例子

设计两个类Bird、Dog

// Bird的声明
@interface Bird : NSObject
{
@public
int weight;
}
- (void)eat;
@end
// Bird的定义
@implementation Bird
- (void)eat {
NSLog(@"吃吃吃-体重:%d", weight);
}
@end
// Dog的声明
@interface Dog : NSObject
{
@public
int weight;
}
- (void)eat;
@end
// Dog的定义
@implementation Dog
- (void)eat {
NSLog(@"吃吃吃-体重:%d", weight);
}
@end
有相同的属性和行为,抽出一个父类Animal(先抽取weight属性,再抽取eat方法)
// Animal的声明
@interface Animal : NSObject
{
@public
int weight;
}
- (void)eat;
@end
// Animal的定义
@implementation Animal
- (void)eat {
NSLog(@"吃吃吃-体重:%d", weight);
}
@end
子类在父类的基础上拓充属性和方法
// Bird的声明
@interface Bird : Animal
{
@public
int height;
}
- (void)fly;
@end

// Bird的定义
@implementation Bird
- (void)fly {
NSLog(@"飞飞飞-高度:%d", height);
}
@end

// Dog的声明
@interface Dog : Animal
{
@public
int speed;
}
- (void)run;
@end
// Dog的定义
@implementation Dog
- (void)run {
NSLog(@"跑跑跑-高度:%d", speed);
}
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: