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

目录: html

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

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

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

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

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

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

里氏替换原则:对象

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

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

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

    二、若是继承的目的是为了多态,而多态的前提就是子类覆盖并从新定义父类的方法,为了符合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就会致使结果与预想的不一致,改变了父类原有的功能。故里氏转换原则应知足如下要求:

  一、子类能够实现父类的抽象方法,但不能覆盖父类的非抽象方法

  二、子类能够增长本身特有的方法

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

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

优势:

  能够大大减小程序的bug以及加强代码的可读性

相关文章
相关标签/搜索