[设计模式原则]第四回:里氏替换原则

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》

 

你可能感兴趣的:(设计模式)