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》

 

posted on 2012-12-27 16:29  Qlin  阅读(1438)  评论(0编辑  收藏  举报