zoukankan      html  css  js  c++  java
  • 设计模式六大原则:里氏替换原则

    目录: 

      设计模式六大原则:单一职责原则

      设计模式六大原则:接口隔离原则 

      设计模式六大原则:依赖倒置原则

      设计模式六大原则:里氏替换原则

      设计模式六大原则:迪米特法则

      设计模式六大原则:开闭原则

    里氏替换原则:

      子类应当可以替换父类并出现在父类能够出现的地方。比如:公司搞年度派对,都有员工都可以抽奖,那么不管是新员工还是老员工,也不管是总部员工还是外派员工,都应当可以参加抽奖。

      里氏替换至少包含一下两个含义:

        1、里氏替换原则是针对继承而言的,如果继承是为了实现代码重用,也就是为了共享方法,那么共享的父类方法就应该保持不变,不能被子类重新定义。子类只能通过新添加方法来扩展功能,父类和子类都可以实例化,而子类继承的方法和父类是一样的,父类调用方法的地方,子类也可以调用同一个继承得来的,逻辑和父类一致的方法,这时用子类对象将父类对象替换掉时,当然逻辑一致,相安无事。

        2、如果继承的目的是为了多态,而多态的前提就是子类覆盖并重新定义父类的方法,为了符合LSP,我们应该将父类定义为抽象类,并定义抽象方法,让子类重新定义这些方法,当父类是抽象类时,父类就是不能实例化,所以也不存在可实例化的父类对象在程序里。也就不存在子类替换父类实例(根本不存在父类实例了)时逻辑不一致的可能。 

    案例:

     1 internal class Program
     2 {
     3     private static void Main(string[] args)
     4     {
     5         A a = new A();
     6         Console.WriteLine($"100-50={(a.func1(100, 50))}");
     7 
     8         B b = new B();
     9         Console.WriteLine($"100-50={(b.func1(100, 50))}");
    10         Console.WriteLine($"100-50={(b.func2(100, 50))}");
    11 
    12         Console.ReadKey();
    13     }
    14 }
    15 
    16 internal class A
    17 {
    18     public int func1(int num1, int num2)
    19     {
    20         return num1 - num2;
    21     }
    22 }
    23 
    24 internal class B : A
    25 {
    26     //public int func1(int num1, int num2)
    27     //{
    28     //    return num1 + num2;
    29     //}
    30 
    31     public int func2(int num1, int num2)
    32     {
    33         return func1(num1, num2) + 100;
    34     }
    35 }
    view code

      由上述代码可以看出,若类B在继承类A时不注意,重写了父类方法func1就会导致结果与预想的不一致,改变了父类原有的功能。故里氏转换原则应满足以下要求:

      1、子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法

      2、子类可以增加自己特有的方法

      3、当子类的方法重载父类的方法时,方法的形参要比父类方法的输入参数更宽松

      4、当子类的方法实现父类的抽象方法时,方法的返回值应比父类更严格

    优点:

      可以大大减少程序的bug以及增强代码的可读性

  • 相关阅读:
    跟面试官聊.NET垃圾收集,直刺面试官G点
    基于.net开发chrome核心浏览器【五】
    HTTP和HTTPS的区别(转)
    Java多线程
    Java常用设计模式
    MVC详解(转)
    java的反射机制浅谈(转)
    进程、线程与处理器的调度(转)
    请简单介绍一下什么是Spring?
    面向对象三大特性概述[封装、继承、多态](转)
  • 原文地址:https://www.cnblogs.com/az4215/p/11462828.html
Copyright © 2011-2022 走看看