1、基本介绍
继承是类中的一个重要的特性,他的出现使得我们没必要别写重复的代码,可重用性很高。当然OC中的继承和Java中是一样的,没多大区别,这里在看一个例子吧:
首先来看一下父类:Car
Car.h
1 #import 2 3 @interface Car : NSObject{ 4 NSString *_brand; 5 NSString *_color; 6 } 7 8 - (void)setBrand:(NSString *)brand; 9 - (void)setColor:(NSString *)color; 10 - (void)brake; 11 - (void)quicken; 12 13 @end
在Car类中定义了两个属性,以及一些方法
Car.m
1 #import "Car.h" 2 3 @implementation Car 4 - (void)setBrand:(NSString *)brand{ 5 _brand = brand; 6 } 7 - (void)setColor:(NSString *)color{ 8 _color = color; 9 } 10 - (void)brake{ 11 NSLog(@"刹车"); 12 } 13 - (void)quicken{ 14 NSLog(@"加速"); 15 } 16 @end
方法的实现
在来看一下子类:
Taxi.h
1 #import "Car.h" 2 3 @interface Taxi : Car{ 4 NSString *_company;//所属公司 5 } 6 7 //打印发票 8 - (void)printTick; 9 10 @end
看到Taxi类继承了父类Car,这里需要导入父类的头文件,然后在Taxi类中多了一个属性和方法
Taxi.m
1 #import "Taxi.h" 2 3 @implementation Taxi 4 5 - (void)printTick{ 6 [super brake]; 7 [self brake]; 8 NSLog(@"%@出租车打印了发票,公司为:%@,颜色为:%@",_brand,_company,_color); 9 } 10 11 @end
对方法的实现,这里我们看到实现文件中是不需要导入父类Car的头文件的,因为可以认为,Taxi.h头文件中已经包含了Car的头文件了。而且,这里可以使用super关键字来调用父类的方法,同时这里我们也是可以用self关键字来调用,这里看到其实这两种方式调用的效果是一样的,当我们在子类重新实现brake方法的时候(Java中的重写概念),那么这时候super关键字调用的还是父类的方法,而self调用的就是重写之后的brake方法了。同样,我们也是可以使用父类中的属性。
再看一下另外一个子类:
Truck.h
1 #import "Car.h" 2 //卡车类继承Car 3 @interface Truck : Car{ 4 float _maxWeight;//最大载货量 5 } 6 7 //覆盖父类的方法brake 8 //优先调用子类的方法 9 - (void)brake; 10 11 - (void)unload; 12 13 @end
这里就自己定义了一个brake方法,这时候就会覆盖父类中的brake方法了。
Truck.m
1 import "Truck.h" 2 3 @implementation Truck 4 5 - (void)brake{ 6 [super brake]; 7 NSLog(@"Truck类中的brake方法"); 8 } 9 10 - (void)unload{ 11 [super brake];//调用父类的方法 12 [self brake];//也是可以的 13 NSLog(@"%@的卡车卸货了,载货量:%.2f,汽车的颜色:%@",_brand,_maxWeight,_color); 14 } 15 16 @end
这里就可以看到,我们会在brake方法中调用一下父类的brake方法,然后在实现我们自己的逻辑代码。
2、继承的其他知识点
1. 继承的专业术语
父类\超类 superclass
子类 subclass\subclasses
2. 继承的细节
单继承
子类和父类不能有相同的成员变量
方法的重写
3. super关键字
分别调用父类的对象方法和类方法
4. 继承的好处
不改变原来模型的基础上,拓充方法
建立了类与类之间的联系
抽取了公共代码
坏处:耦合性强
5. 继承的使用场合
它的所有属性都是你想要的,一般就继承
它的部分属性是你想要的,可以抽取出另一个父类
6.子类方法和属性的访问过程:
如果子类没有,就去访问父类的
父类被继承了还是能照常使用的
父类的静态方法
画继承结构图,从子类抽取到父类
NSObject的引出:全部OC类的最终父类,包含了一些常用方法,比如+new
3、例子
设计两个类Bird、Dog
1 // Bird的声明 2 @interface Bird : NSObject 3 { 4 @public 5 int weight; 6 } 7 - (void)eat; 8 @end 9 // Bird的定义 10 @implementation Bird 11 - (void)eat { 12 NSLog(@"吃吃吃-体重:%d", weight); 13 } 14 @end 15 // Dog的声明 16 @interface Dog : NSObject 17 { 18 @public 19 int weight; 20 } 21 - (void)eat; 22 @end 23 // Dog的定义 24 @implementation Dog 25 - (void)eat { 26 NSLog(@"吃吃吃-体重:%d", weight); 27 } 28 @end 29 有相同的属性和行为,抽出一个父类Animal(先抽取weight属性,再抽取eat方法) 30 // Animal的声明 31 @interface Animal : NSObject 32 { 33 @public 34 int weight; 35 } 36 - (void)eat; 37 @end 38 // Animal的定义 39 @implementation Animal 40 - (void)eat { 41 NSLog(@"吃吃吃-体重:%d", weight); 42 } 43 @end 44 子类在父类的基础上拓充属性和方法 45 // Bird的声明 46 @interface Bird : Animal 47 { 48 @public 49 int height; 50 } 51 - (void)fly; 52 @end 53 54 // Bird的定义 55 @implementation Bird 56 - (void)fly { 57 NSLog(@"飞飞飞-高度:%d", height); 58 } 59 @end 60 61 // Dog的声明 62 @interface Dog : Animal 63 { 64 @public 65 int speed; 66 } 67 - (void)run; 68 @end 69 // Dog的定义 70 @implementation Dog 71 - (void)run { 72 NSLog(@"跑跑跑-高度:%d", speed); 73 } 74 @end