1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace LiskovSubstitutionPrinciple
  6. {
  7. //里氏替换原则(Liskov Substitution Principle) LSP
  8. //If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T,
  9. //the behavior of P is unchanged when o1 is substituted for o2 than S is a subtype of T.
  10. //(如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有对象o1都替换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。)
  11. //通俗点讲,只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者根本不需要知道是父类还是子类。
  12. //但是反过来就不行了,有子类出现的地方,父类未必能适应(因为子类可能存在自己的方法属性,父类并不知道呀)。
  13. class Program
  14. {
  15. static void Main(string[] args)
  16. {
  17. Square square = new Square();
  18. //隐式转换,只要父类Shape能出现的地方子类就可以出现
  19. Shape shape = new Rectangle(, );//替换为子类也不会产生任何错误或异常,这是因为子类肯定继承了父类的方法属性。
  20. //显示转换
  21. Shape shape2 = (Shape)square;
  22.  
  23. //只要父类Shape能出现的地方子类square、rectangle就可以出现
  24. GetShapeArea(shape);
  25. GetShapeArea(shape2);
  26. GetShapeArea(square);
  27.  
  28. //只要父类IDisposable能出现的地方子类square、rectangle就可以出现
  29. DisposeShape(shape);
  30. DisposeShape(shape2);
  31. DisposeShape(square);
  32. }
  33.  
  34. static public void GetShapeArea(Shape shape)
  35. {
  36. //得益于LSP,我们不用知道实际的子类是什么,提高了扩展性
  37. Console.WriteLine(shape.Name + "的面积为" + shape.GetArea());
  38. }
  39.  
  40. //同理,继承接口也是一种继承,暂且认为接口IDisposable也是父类吧~
  41. static public void DisposeShape(IDisposable obj)
  42. {
  43. obj.Dispose();
  44. }
  45. }
  46.  
  47. /// <summary>
  48. /// 有抽象方法的类一定是抽象类,抽象类自身不能被实例化。
  49. /// 继承增强了耦合,父类在进行改动时,要考虑子类的修改,不然全部子类都要重构!
  50. /// </summary>
  51. public abstract class Shape : IDisposable
  52. {
  53. private string name;
  54.  
  55. public string Name
  56. {
  57. get { return name; }
  58. set { name = value; }
  59. }
  60. private int width;
  61.  
  62. public int Width
  63. {
  64. get { return width; }
  65. set { width = value; }
  66. }
  67. private int height;
  68.  
  69. public int Height
  70. {
  71. get { return height; }
  72. set { height = value; }
  73. }
  74.  
  75. //子类一定要实现抽象方法
  76. public abstract int GetArea();
  77.  
  78. public void Dispose()
  79. {
  80. Console.WriteLine(Name + "释放掉了");
  81. }
  82. }
  83.  
  84. /// <summary>
  85. /// 正方形,继承Shape使得我们代码重用,减少工作量。
  86. /// </summary>
  87. public class Square : Shape
  88. {
  89. public Square(int width)
  90. {
  91. Name = "Square";
  92. Width = width;
  93. //继承虽好,但是只要继承,就必须拥有父类的所有属性和方法,这里的Height对于正方形来说其实没有存在的必要,因为四边都相等呐。
  94. Height = width;
  95. }
  96.  
  97. //我们只需实现抽象方法,其他东西一律继承!~
  98. public override int GetArea()
  99. {
  100. return Width * Height;
  101. }
  102. }
  103.  
  104. /// <summary>
  105. /// 长方形
  106. /// </summary>
  107. public class Rectangle : Shape
  108. {
  109. public Rectangle(int width, int height)
  110. {
  111. Name = "Rectangle";
  112. Width = width;
  113. Height = height;
  114. }
  115.  
  116. public override int GetArea()
  117. {
  118. return Width * Height;
  119. }
  120. }
  121. }

里氏替换原则(Liskov Substitution Principle) LSP的更多相关文章

  1. 里氏代换原则(Liskov Substitution Principle,LSP)

    第一种定义: 如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换为o2,程序P的行为没有发生变化,那么类型S是类型T的子类型. 第二种定义: 所有引 ...

  2. 里氏替换原则(Liskov Substitution Principle,LSP)

    肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑.其实原因就是这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的. 定义1:如果对每一 ...

  3. 设计模式六大原则(二):里氏替换原则(Liskov Substitution Principle)

    里氏替换原则(LSP)由来: 最早是在 妖久八八 年, 由麻神理工学院得一个女士所提出来的. 定义: 1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 ...

  4. 面象对象设计原则之三:里氏替换原则(The Liskov Substitution Principle,LSP)

    里氏代换原则由2008年图灵奖得主.美国第一位计算机科学女博士Barbara Liskov教授和卡内基·梅隆大学Jeannette Wing教授于1994年提出.其严格表述如下:如果对每一个类型为S的 ...

  5. 设计模式原则(2)--Liskov Substitution Principle(LSP)--里氏替换原则

    1.定义: 所有引用基类(父类)的地方必须能透明地使用其子类的对象.这一原则与继承紧密相关.如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的 ...

  6. 面向对象设计原则 里氏替换原则(Liskov Substitution Principle)

    里氏替换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一. 里氏替换原则中说,任何基类可以出现的地方,子类一定可以出现. LSP是继承复用的基石,只 ...

  7. 【面向对象设计原则】之里氏替换原则(LSP)

    里氏代换原则由2008年图灵奖得主.美国第一位计算机科学女博士Barbara Liskov教授和卡内基·梅隆大学Jeannette Wing 教授于1994年提出,所以使用的是这位女博士的性命名的一个 ...

  8. 面向对象五大原则_1.单一职责原则&amp;2.里氏替换原则

    单一职责原则:Single Responsibility Principle (SRP) 一个类.仅仅有一个引起它变化的原因.应该仅仅有一个职责.每个职责都是变化的一个轴线.假设一个类有一个以上的职责 ...

  9. 里氏替换原则(Liskov Substitution Principle)

    开放封闭原则(Open Closed Principle)是构建可维护性和可重用性代码的基础.它强调设计良好的代码可以不通过修改而扩展,新的功能通过添加新的代码来实现,而不需要更改已有的可工作的代码. ...

  10. Java设计原则之里氏替换原则

    里氏代换原则由2008年图灵奖得主.美国第一位计算机科学女博士Barbara Liskov教授和卡内基·梅隆大学Jeannette Wing教授于1994年提出.其严格表述如下:如果对每一个类型为S的 ...

随机推荐

  1. 排序算法汇总(java实现,附源代码)

    整理系统的时候发现了原来写的各种算法的总结,看了一下,大吃一惊,那时候的我还如此用心,具体的算法,有的已经模糊甚至忘记了,看的时候就把内容整理出来,顺便在熟悉一下,以后需要的时候就可以直接过来摘抄了. ...

  2. C#winform拖动无边框窗体

    private bool isMouseLeftKeyDown = false; private Point mousePointToClient = new Point();//相对于本窗体鼠标位置 ...

  3. 去掉html标签方法

    public static string CleanHtml(string strHtml) { strHtml = Regex.Replace(strHtml, @"(\<scrip ...

  4. c# 根据文件夹或文件名返回(文件夹或文件)的完整路径

    c#  根据文件夹或文件名返回(文件夹或文件)的完整路径 一.方案一:(使用windows API) 二.方案二:(扫描全盘)

  5. 八、Node.js-http模块

    JS代码如下: /* 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi,来处理客户端的请求相应. 不过对 N ...

  6. 【02】循序渐进学 docker:如何安装

    写在前面的话 我们接下来的操作都是 CentOS 7.5 以下完成的,为了避免你我结果不一致,建议你也采用 CentOS 7.5,原因如下: 1. 个人几年工作下来经历的公司,包括身边的运维朋友,90 ...

  7. [转]解读Unity中的CG编写Shader系列1——初识CG

    CG=C for Graphics  用于计算机图形编程的C语言超集 前提知识点: 1.CG代码必须用 CGPROGRAM ... ENDCG括起来 2.顶点着色器与片段着色器的主函数名称可随意,但需 ...

  8. Mybatis 延迟加载策略

    延迟加载: 就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据.延迟加载也称懒加载. 好处: 先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速 ...

  9. 如何安装memcached

    软件的下载,好像从官网上只能下载未经编译的源码,需要自己编译后才能安装使用,不熟悉的用户还是直接百度搜索下载比较好,这里也提供一个下载地址给大家参考. www.newasp.net/soft/6373 ...

  10. OOP1(定义基类和派生类)

    面向对象程序设计基于三个基本概念:数据抽象,继承和动态绑定 数据抽象是一种依赖于接口和实现分离的编程技术.继承和动态绑定对程序的编号有两方面的影响:一是我们可以更容易地定义与其它类相似但不完全相同的类 ...