里式替换原则
设计原则
1.概念及理解
- 原意:使用基类的指针或引用的函数,必须是在不知情的情况下,能够使用派生类的对象。
- 理解:父类能够替换子类,但子类不一定能替换父类。并且子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说,在代码中可以将父类全部替换为子类,程序不会报错,也不会在运行时出现任何异常,但反过来却不一定成立。
- 应用:在继承类时,务必重写(Override)父类中所有的方法,尤其需要注意父类的 protected 方法(它们往往是让您重写的),子类尽量不要暴露自己的 public 方法供外界调用。
2.优点
- 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性。
- 提高代码的重用性及可扩展性。
- 提高产品或项目的开放性。
3.说明
- 提到父类和子类,我们最先想到的可能就是继承,但在Java中,提倡不用继承,原因如下:
- 1).继承是侵入性的,只要继承,就必须拥有父类的所有属性和方法。
- 2).降低代码的灵活性,容易出现牵一发而动全身的效果。
- 3).增强了耦合性。当父类的常量、变量和方法被修改时,需要考虑子类的修改,而且在缺乏规范的环境下,这种修改可能需要代码重构。
- 这时我们就需要加入里式替换原则,其包括以下含义:
- 1).子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法。
- 2).子类中可以增加自己特有的方法。
- 3).当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
- 4).当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
可能我们在进行代码编写时,未遵循里式替换原则,项目也在好好地运行,造成一种没必要遵循里式替换原则的错觉,但是这回大大增加出现问题的几率。在实际应用中,我们应该遵循里式替换原则,在理解及认知后,避免出现问题的几率和提高代码安全性。