二、继承
继承是类中的一个重要的特性,他的出现使得我们没必要别写重复的代码,可重用性很高。当然OC中的继承和Java中是一样的,没多大区别,这里在看一个例子吧:
首先来看一下父类:Car
Car.h
-
-
-
-
-
-
-
-
- #import <Foundation/Foundation.h>
-
- @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"
-
- @interface Truck : Car{
- float _maxWeight;
- }
-
-
-
- - (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方法,然后在实现我们自己的逻辑代码。
好了,继承就说这么多了,其实封装和继承两个特性没什么难度的,很容易理解的,下面在来看一下最后一个特性:多态