zoukankan      html  css  js  c++  java
  • [设计模式原则]第四回:里氏替换原则

    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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    MongoDB 分片管理(一)检查集群状态
    MongoDB 副本集
    MongoDB 集群设置集合分片生效及查看集合分片情况
    mongodb 导入json文件遇到的坑
    GreenPlum/postgres copy命令导出/导入数据
    Mongo mongoexport/mongoimport介绍
    mongoDB之监控工具mongostat
    Oracle ORA-00600[2662] 解决
    ORA-00600[2662]问题 汇总
    MySQL的基本使用
  • 原文地址:https://www.cnblogs.com/qqlin/p/2829480.html
Copyright © 2011-2022 走看看