定义
所有引用基类的地方必须能透明地使用其子类的对象。(子类可以替换父类)
use pointers or references to base classes must be able to use objects of derived classes without knowing it.
通俗点讲,只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任 何错误或异常,使用者可能根本就不需要知道是父类还是子类。但是,反过来就不 行了,有子类出现的地方,父类未必就能适应。
含义
- 子类必须完全实现父类的方法
- 子类可以有自己的个性
- 覆盖或实现父类的方法时输入参数可以被放大。如果父类的输入参数类型大于子类的输入参数类型,会出现父类存在的地方,子类未必会存在,因为一旦把子类作为参数传入,调用者很可能进入子类的方法范畴。
- 覆写或实现父类的方法时输出结果可以被缩小 父类的一个方法的返回值是一个类型 T,子类的相同方法(重载或覆写)的返
回值为 S,那么里氏替换原则就要求 S 必须小于等于 T,也就是说,要么 S 和 T 是同一个类型,要么 S 是 T 的子类。
优缺点
优点
- 提高代码的重用性,子类拥有父类的方法和属性;
- 提高代码的可扩展性,子类可形似于父类,但异于父类,保留自我的特性
缺点
- 继承是侵入性的,只要继承就必须拥有父类的所有方法和属性,在一定程度上约束了子类,降低了代码的灵活性;
- 增加了耦合,当父类的常量、变量或者方法被修改了,需要考虑子类的修改,所以一旦父类有了变动,很可能会造成非常糟糕的结果,要重构大量的代码。