一.
覆盖讲解了好几节,看来确实是个很重要的知识点。
其实我们最关心的不是覆盖的特点和覆盖的注意事项,这些小东西只要稍加注意,不写错就可以了。我们要注重什么,什么时候使用覆盖操作,这是我们开发时,使用最频繁的。
先不管什么覆不覆盖了,先用一个案例演示一遍。
先描述一个小事物,手机。手机有个功能就是来电显示,早期的手机,显示的只有num。编译后,一运行,发现没有任何问题。
接下来,遇到一些问题。现在手机出来很多新的版本,来电显示功能发生了一些变化,有显示姓名和照片。我们要将这些东西加进来,
直接在原有的基础上,加上一些新的内容。编译运行没有问题。
但是有一些小问题,无论是name,还是picture都是后来的,把它们写在一起,合适么?不太合适,因为添加的name和pic相当于升级,这也是后期维护中的一部分。如果每次升级,都是修改源代码的话,如果发现升级的不对,还得该回去,这就会造成修改成本。这样就不利于该程序的扩展。而且,一升级就去修改代码的话,往往修改的不是一处,是多处,就会给你的升级带来灾难,甚至是毁灭性的,等你改完,不一定能改回去。所以,一般情况下,我们不建议对源代码进行修改,这样最危险。因此,在设计的时候就变得很重要,如果设计不好,后面全都出现不行。
因此,我们可以这么做,可以搞一个新类,newphone,它也是电话中的一种,让它去继承以前的phone就可以了,创建新的显示方法,来显示后期添加的东西。
(这里为什么会有number的重复出现,是不是显得有点多余?)
一样是产生变化,但我们不准备去修改原来的类,直接通过一个类去继承它。用继承的方式来进行扩展。如果单独设计个类,和之前的一点关系都没有,会显得很麻烦,因为这个phone类中还有其他功能是不需要修改的,比如说通话,从以前到现在,通话功能一直都是一样的。也就是phone类中还有call()方法,你觉着newphone类中还需要重新定义么?就不需要了,而且我们知道新的东西,就是老的类中的一种,为什么不直接继承call(),拿来用呢?只是show()方法变了。因此,用继承就可以提高程序的扩展性。
DOS结果显示,没有任何问题。看样子是解决了问题,但是还有不爽。这个newphone继承了phone,相当于继承了父类中的两个方法,意味着它也可以调用show(), 结果显示是可以的,
但是爽吗?不爽了。子类出现以后,无非是为了改良父类中的来电显示功能,但是它有必要更改来电显示声明吗(这里是说show的名字)?父类本身就有来电显示的功能,子类只要继承过来就可以了,但是呢?子类想说,这个功能,我可以保留,但是我想改变功能的内容(保留show方法声明,但是里面的执行内容要发生变化)。这该怎么操作?没必要定义新方法,新方法定义完以后,老方法一样可以拿来用,而我要做的,就是把已有的来电显示功能改良。
想改良做的最简单的动作就是覆盖,保留父类原有功能,创建子类特有内容。以前有来电显示,我不喜欢,但是功能还得要,因为我也需要来电显示,只是我的来电显示的内容和你不一样。
只要创建的是子类的对象,那么既能用show(), 也能用call(),p走的是子类的来电显示,和phone走的不一样,但也能走phone的call()。
这里还有一点要注意,子父类的方法中num写了两遍,
为什么不直接省略num这个语句呢?因为是覆盖,如果省略了num语句,那么调用子类的show()方法时,就没有num输出了。