小糖出品:面向对象三大特性之继承

来源:互联网 发布:mysql error1366 编辑:程序博客网 时间:2024/04/30 00:45

                           上一篇博客,小糖讲到了面向对象三大特性之封装,现在,小糖就来讲讲面向对象三大特性之继承。

                           什么是继承呢?小糖举个例子,比如说下面这个图

                                                                        

从图中我们可以看出来,各个层次之间有很明显的继承关系,动物是一个大类,这个大类分成了食草动物和食肉动物,食草动物继承了动物的特征,动物有的特征食草动物也有,但是食草动物有一些特征区别于动物,食肉动物也是同样的意思。食草动物中有兔子这一类,兔子继承了食草动物的特征,同时兔子也有一些食草动物所没有的东西。那么,动物和食草动物、食肉动物之间就存在着继承的关系,同样,食草动物和兔子、食肉动物和老虎之间也存在着继承关系。动物可以说是食草动物的父类,食草动物是动物的父类。食草动物是兔子的父类,兔子是食草动物的子类,所以我们也可以说动物是兔子的间接父类,兔子是动物的间接子类。从图中我们可以很清楚看到继承的特点:

                             1.子类继承父类的全部成员变量和方法。

                             2.子类可以对父类进行扩展。

                         学过c++的人应该知道,在c++中有着多继承的特征,即一个类可以有多个父类。但是oc摒弃了多继承,即一个类最多只有一个直接父类。这里为啥不直接说父类,而是说直接父类呢?因为如果说oc中一个类只有一个父类,这种说法是错误的。就像上面图中所看到的一样,一个类可以有多个间接父类。比如说

                                                           @interface Predator:Animal ..... @end

                                                           @interface Tiger:Predator .... @end

这样定义的话,可以说Predator是Tiger的父类,也可以说Animal是Tiger的父类,这两者有啥区别呢?Predator是Tiger的直接父类,而Animal是Tiger的间接父类。

                         说了那么多,我们用例子来加深理解吧。假设我们定义了一个动物类。在定义一个继承与动物的Tiger类。定义动物类如下:

                                                   

我们用@property定义了一个weight属性,又定义了一个eat方法,我们在做如下实现:

                                                 

这样我们自动为weight合成了setter和getter方法,在eat方法实现部分打印了一句话。现在,我们再定义一个Tiger类,继承于Animal类:

                                                 

从上面我们可以看出,在:之前的是子类,在:之后的是父类。我们在子类中同样定义了一个eat方法,如果我们不做实现的话,那么我们如果在main里面这样写的话:

                                              

输出的结果是什么呢?我们来看一下:

                                               

运行结果是正确的,而且从结果我们可以看出来,父类的方法和成员变量在子类中都可以使用。那么,如果我们要改变父类的方法怎么办呢?比如说这时候Tiger的eat方法就和动物的有些不一样,我们该怎么进行修改呢?还记得我们在Tiger里面定义了一个方法eat吗?那么我们现在就来重写父类方法:

                                               

我们在实现部分对eat方法进行重写,这样的话父类的方法就会被子类重写的方法覆盖掉。好,我们来看一下运行结果:

                                             

父类的eat方法被覆盖掉了。这个过程就是一个继承的过程。

                       既然说到了继承,那么小糖就再次说下self和super这两个关键字, super关键字可以调用从父类继承下来的方法,记得小糖曾经说过自定义初始化方法,在里面有这么一段代码 [super init];这个代码什么意思呢?其实就是用super关键字来调用父类中的 init 方法,也就是说如果你想在子类中调用父类中的方法,可以用super关键字,特别是在子类中重写了父类的方法,也就是父类的某个方法被覆盖了,那么我如果在子类中想要调用这个被覆盖的方法的话,也可以用super关键字。super调用过程是先从当前子类的父类中找该方法,如果没有,再从子类的间接父类中找,一直找到NSObject这个类中,如果有,就调用,没有就不会调用。

                       self呢,小糖说过self调用的是当前类中的方法,但是如果当前类中没有该方法,就会去当前类的父类中去寻找,和上面一样。因为父类将方法都继承给了子类,那么父类的方法子类都有,所以self调用的也相当于调用当前类的方法。

                       这里需要注意一下,super只能调用父类的方法,是无法调用当前类中的方法,如果调用,将会报错。而self不仅可以调用当前类的方法,也可以调用父类的方法。

                       好了,继承小糖就先讲到这里了。如果有什么不对的地方欢迎纠错哦。如果漏掉什么的话会在以后的博客中继续补充的。那么,我们下一篇博客再见咯。

0 0
原创粉丝点击