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


    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》

    作者:Qlin
    出处:http://www.cnblogs.com/qqlin/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    更快的datetime string to python datetime转换模块 ciso8601
    华为新员工入职培训计划曝光!你留不住员工的原因就在这! zz
    在vmware中安装macos系统 vm12 osx10.11 or higher
    vmware for linux (centos65) 卸载相关
    第八章多态
    第七章 复用类
    第六章 访问权限控制
    Think in Java 第四 五 章
    Think in Java 第三章操作符
    Thank in Java
  • 原文地址:https://www.cnblogs.com/qqlin/p/2829480.html
Copyright © 2020-2023  润新知