经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式六大原则:里氏替换原则
来源:cnblogs  作者:酷学大叔  时间:2019/9/10 10:57:45  对本文有异议

目录: 

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

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

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

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

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

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

里氏替换原则:

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

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

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

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

案例:

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

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

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

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

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

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

优点:

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

原文链接:http://www.cnblogs.com/az4215/p/11462828.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号