继承

在我们没接触编程时,听到继承这个词,或许脑海中会想到实际生活中的一个场景:谁继承了谁的遗产,然后我们可以认知到继承者拥有了被继承者留下的哪些东西。要注意的是:基于生活中这种情况,交代了【被继承者】已死亡的事实,而在程序中不会存在【被继承者】已”死亡“的这种说法定义,在程序中讨论继承时,只是用来描述两者之间的关系以及建立了这种继承关系后会有哪些特点。所以在程序中讨论继承者与被继承者时,根据两者拥有什么东西来讨论的话,会更容易理解。

 

上面提到的【拥有什么东西】在程序中来解释的话,所描述的就是【类】以及【类中的成员】。现在来定义如下两个类:

1:【猫】类

  属性:名字、颜色、体重

  方法:打招呼()、吃东西()

2:【狗】类

  属性:名字、颜色、体重、品种

  方法:打招呼()、吃东西()

 

根据以上两个类来看,用代码可以轻松的封装实现出来,但是根据上面类中成员可以发现,生活中其他它类型的猪、猴、牛、羊等都有这些特征。如果按照以上思维来编写代码的话,那就意味着在定义其它众多的动物类时,每个类都需要定义这些属性和方法,显然这不是一种友好的实现方式,所以我们需要以新的实现方式来达到这种目的,这也就是本篇中需要讨论的【继承】。

 

在前面理解类与封装时,类是将具有相同特征和行为的事物封装在一起。那么用【类】结合【继承】的思想将上面场景重新定义类如下:

1:【动物】类

  属性:名字、颜色、体重

  方法:打招呼()、吃东西()

2:【猫】类 继承 【动物】类

3:【狗】类 继承 【动物】类

  属性:品种

 

将【猫类】和【狗类】,去继承【动物类】,而各自的类无需再定义:名字、颜色、体重、打招呼、吃东西这些属性和方法,而通过【继承】让它们都拥有了【动物类】的属性和方法,如果各自的类有特别的特征和行为,则在各自类中定义需要的属性和方法即可(如:品种这个属性)。

回到开始说的【拥有】这个词,现在可以很好的理解程序中的继承是什么,在程序中通过【继承】的手段,使继承者拥有了被继承者的特征和行为。

 

至此,在分析类与类的关系中,延伸出了【继承】的思想。而在面向对象中,将继承者称为:子类(或派生类);将被继承者称为:父类(或基类)。

 

而通过上面的场景,体会了继承的好处,但也会暴露出一些问题,比如:【打招呼】和【吃东西】这两个行为方法,对于猫来说它是通过“喵喵喵”来打招呼的,以及猫其实是吃鱼;对于狗来说它是通过“汪汪汪”来打招呼的,以及狗其实是吃骨头。所以在定义父类(基类)时,不确定这两个方法体该如何实现,那这种问题该如何处理?