上面提到的【拥有什么东西】在程序中来解释的话,所描述的就是【类】以及【类中的成员】。现在来定义如下两个类:
1:【猫】类
属性:名字、颜色、体重
方法:打招呼()、吃东西()
2:【狗】类
属性:名字、颜色、体重、品种
方法:打招呼()、吃东西()
根据以上两个类来看,用代码可以轻松的封装实现出来,但是根据上面类中成员可以发现,生活中其他它类型的猪、猴、牛、羊等都有这些特征。如果按照以上思维来编写代码的话,那就意味着在定义其它众多的动物类时,每个类都需要定义这些属性和方法,显然这不是一种友好的实现方式,所以我们需要以新的实现方式来达到这种目的,这也就是本篇中需要讨论的【继承】。
在前面理解类与封装时,类是将具有相同特征和行为的事物封装在一起。那么用【类】结合【继承】的思想将上面场景重新定义类如下:
1:【动物】类
属性:名字、颜色、体重
方法:打招呼()、吃东西()
2:【猫】类 继承 【动物】类
3:【狗】类 继承 【动物】类
属性:品种
将【猫类】和【狗类】,去继承【动物类】,而各自的类无需再定义:名字、颜色、体重、打招呼、吃东西这些属性和方法,而通过【继承】让它们都拥有了【动物类】的属性和方法,如果各自的类有特别的特征和行为,则在各自类中定义需要的属性和方法即可(如:品种这个属性)。
回到开始说的【拥有】这个词,现在可以很好的理解程序中的继承是什么,在程序中通过【继承】的手段,使继承者拥有了被继承者的特征和行为。
至此,在分析类与类的关系中,延伸出了【继承】的思想。而在面向对象中,将继承者称为:子类(或派生类);将被继承者称为:父类(或基类)。
而通过上面的场景,体会了继承的好处,但也会暴露出一些问题,比如:【打招呼】和【吃东西】这两个行为方法,对于猫来说它是通过“喵喵喵”来打招呼的,以及猫其实是吃鱼;对于狗来说它是通过“汪汪汪”来打招呼的,以及狗其实是吃骨头。所以在定义父类(基类)时,不确定这两个方法体该如何实现,那这种问题该如何处理?