1.引言
里氏替换原则(LSP,Liskov Substitution Principle)是关于继承机制的原则,是实现开放封闭原则的具体规范,违反了里氏替换原则必然违反了开放封闭原则。
2.引经据典
核心思想:子类必须能够替换其基类。
一些理解
- 子类继承基类,是一种IS-A关系,只能说子类 IS-A 基类,不能反过来,该原则说的就是处理继承问题的原则。
- 父类的非抽象方法,不应该被子类重写,重写了就会改变原来父类的方法,造成意想不到的结果,就不能完全代表父类了,如果有意要子类重写请声明虚方法或者抽象方法。
3.应用反思
//开关 public class Switch { public void TurnOn() { Console.WriteLine("打开开关"); } public void TurnOff() { Console.WriteLine("关上开关"); } } //播放器 public class Player : Switch { public void TurnOn() { Console.WriteLine("打开播放器"); } public void Play() { Console.WriteLine("开始播放"); } }
//调用 Player player = new Player(); player.TurnOn(); //输出:打开播放器
上面示例中 看到调用的结果,违反了 里氏替换原则,Player 的TurnOn已经覆盖了 基类Switch的方法,这时Player 的TurnOn方法相当于new隐藏了父类的方法,这时子类是无法代替父类的,因为改变了父类的方法,如果要改变,应该声明为 虚方法,子类用 override进行重写。
4.规则建议
- 里氏替换原则是关于继承机制的原则,违反了里氏替换原则必然违反了开放封闭原则。
- 里氏替换原则能够保证系统有良好的扩展性,同时实现了多态的抽象机制,减少代码冗余,避免运行期的类型判断。
- 子类必须满足基类和客户端对其行为的约定,客户端对行为的期望在基类和子类必须保持一致。
- IS-A是基于行为的方式,它依赖于客户端的调用方式,对象的行为方式才是值得关注的要素。
- 子类的异常必须控制在基类可以预计的范围,否则将导致替换违规。
查看资料:《你必须知道的.NET》