• C#设计模式六大原则之里氏替换原则


    里氏替换原则(Liskov Substitution Principle)

    在面向对象的程序设计中,里氏替换原则(Liskov Substitution principle)是对子类型的特别定义。它由芭芭拉·利斯科夫(Barbara Liskov)在1987年在一次会议上名为“数据的抽象与层次”的演说中首先提出。里氏替换原则的内容可以描述为: “派生类(子类)对象可以在程式中代替其基类(超类)对象。”,所有引用基类的地方必须能透明化地使用其子类的对象。多态是一种面向对象的机制(面向对象三大特性之一),它包括静态多态(函数重载)和动态多态(函数覆盖,或者成为动态绑定),通常是指动态多态,即程序在运行时,子类对象的行为(方法)可以覆盖父类对象的行为(方法)。而里氏代换原则(LSP)是一种面向对象设计原则,任何使用父类的地方都可以使用子类对象,使得我们可以针对父类编程,而运行时再确定使用哪个子类对象,从而提高系统的可扩展性和可维护性。在里氏代换原则中,实际上也使用了多态机制,子类对象在覆盖父类对象时,通过多态即可覆盖父类的行为。 子类必须完全实现父类有的方法,如果子类没有父类的某项内容,就断掉继承;子类可以有父类没有的东西,所以子类的出现的地方,不一定能用父类来代替;透明,就是安全,父类的东西换成子类后不影响程序。

    例如,

    1)反面示例

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. namespace ConsoleApplication
    7. {
    8. class Program
    9. {
    10. static void Main(string[] args)
    11. {
    12. {
    13. Animal animal = new AnimalBird("鸟");
    14. animal.Eat();
    15. animal.Move();
    16. animal.Fly();
    17. }
    18. {
    19. Animal animal = new AnimalCow("牛");
    20. animal.Eat();
    21. animal.Move();
    22. animal.Fly();//牛能飞这样的设计,继承了不应该用的方法,违背里氏替换原则
    23. }
    24. Console.ReadKey();
    25. }
    26. }
    27. public class Animal
    28. {
    29. protected string _Name = null;
    30. public Animal(string name)
    31. {
    32. this._Name = name;
    33. }
    34. public void Eat()
    35. {
    36. Console.WriteLine($"{this._Name} 吃东西");
    37. }
    38. public void Move()
    39. {
    40. Console.WriteLine($"{this._Name} 走路");
    41. }
    42. public void Fly()
    43. {
    44. Console.WriteLine($"{this._Name} 起飞");
    45. }
    46. }
    47. public class AnimalCow : Animal
    48. {
    49. public AnimalCow(string name) : base(name)
    50. {
    51. }
    52. }
    53. public class AnimalBird : Animal
    54. {
    55. public AnimalBird(string name) : base(name)
    56. {
    57. }
    58. }
    59. }

     2)里氏替换原则

     

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. namespace ConsoleApplication
    7. {
    8. class Program
    9. {
    10. static void Main(string[] args)
    11. {
    12. {
    13. Animal animal = new Bird("鸟");
    14. animal.Eat();
    15. animal.Move();
    16. animal.Fly();
    17. }
    18. {
    19. Animal animal = new Cow("牛");
    20. animal.Eat();
    21. animal.Move();
    22. //animal.Fly();
    23. }
    24. Console.ReadKey();
    25. }
    26. }
    27. public class Animal
    28. {
    29. protected string _Name = null;
    30. public Animal(string name)
    31. {
    32. this._Name = name;
    33. }
    34. public void Eat()
    35. {
    36. Console.WriteLine($"{this._Name} 吃东西");
    37. }
    38. public void Move()
    39. {
    40. Console.WriteLine($"{this._Name} 走路");
    41. }
    42. }
    43. public class Bird : Animal
    44. {
    45. public Bird(string name) : base(name)
    46. {
    47. }
    48. public void Fly()
    49. {
    50. Console.WriteLine($"{this._Name} 起飞");
    51. }
    52. }
    53. /* //其它鸟可以这样继承
    54. public class Peacock : Bird
    55. {
    56. public Cow(string name) : base(name)
    57. {
    58. }
    59. } */
    60. public class Cow : Animal
    61. {
    62. public Cow(string name) : base(name)
    63. {
    64. }
    65. }
    66. public class Bird : Animal
    67. {
    68. public Bird(string name) : base(name)
    69. {
    70. }
    71. }
    72. }

  • 相关阅读:
    23种设计模式之创建型模式篇
    C++ STL库的介绍和使用
    imu测试--UDP、PTP
    python常用知识梳理(必看篇)
    redis基础数据结构
    实现excel导出最简单方式
    十、【图框工具组】
    MyBatis-Plus: 简化你的MyBatis应用
    K8S安装过程七:Kubernetes 节点配置调整
    C++ 小游戏 视频及资料集(5)
  • 原文地址:https://blog.csdn.net/lwf3115841/article/details/133774079