里氏替换原则(Liskov Substitution Principle or LSP)

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/343 访问。

所有引用基类的地方必须透明的使用其子类的对象。

LSP:Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.

在代码中将基类对象转换成其子类对象,不应当产生任何错误或异常。

示例:

namespace Liskov
public abstract class Shape {public abstract double Area();public abstract void Draw();public virtual void ShowMessage() {Console.WriteLine($"I'm a(n) {this.ToString()}!");}}
public class Rectangle : Shape {public int Height = 3;public int Width = 7;public override double Area() => Height * Width;public override void Draw() {Console.WriteLine("Draw Rectangle!");}}
public class Circle : Shape {public int Radii = 6;const double PI = 3.1415926535898;public override double Area() => PI * Math.Pow(Radii, 2);public override void Draw() {Console.WriteLine("Draw Circle!");}}

首先建立Shape形状抽象基类,包含2个抽象方法Area和Draw,另外包含1个虚拟方法ShowMessage并提供默认实现。里氏替换原则要求尽可能的使用其基类作为方法的参数,以下给出一个解决方案以供参考:

public static void DoSomething(Shape shape) {var area = shape.Area();shape.Draw();shape.ShowMessage();}

以下是一个调用方可能的代码:

Shape shape = new Rectangle();
DoSomething(shape);shape = new Circle();
DoSomething(shape);Console.ReadKey();

以下是这个案例的输出结果:

I'm a(n) Liskov.Rectangle!
I'm a(n) Liskov.Circle!

里氏替换原则根据“运行时子类对象覆盖父类对象”的特点,可以很方便的对系统进行扩展,只需要增加子类而无需更改任何现有代码。例如增加一个新的正方形子类Square,而不需要对DoSomething方法做任何改动。

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/343 访问。

面向对象设计原则之3-里氏替换原则相关推荐

  1. 面象对象设计6大原则之三:里氏替换原则

    转载自 面象对象设计6大原则之三:里氏替换原则 里氏替换原则(LSP),The Liskov Substitution Principle 定义 所有引用基类的地方必须能透明地引用其子类的对象,即子类 ...

  2. 「设计模式」六大原则之三:里氏替换原则小结

    文章目录 1.里式替换原则定义 2. 举例说明 示例1: 示例2: 3. 哪些代码明显违背了 LSP? 子类违背父类声明要实现的功能 子类违背父类对输入.输出.异常的约定 子类违背父类注释中所罗列的任 ...

  3. 面向对象设计原则之三:里氏替换原则

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

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

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

  5. 设计模式六大原则: 狸猫换太子 -- 里氏替换原则

    据野史传说中记载,当年宋哲宗最宠爱的妃子是刘德妃.刘德妃虽然深受皇上宠爱,但是却久久不能生育.刘德妃为竞争皇后之位,提高自己的身价,便想出了"借腹怀孕"的诡计.她打算利用身旁的一个 ...

  6. 设计模式六大原则之〈里氏替换原则〉

    里氏替换原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的. 定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的 ...

  7. 里氏替换原则——面向对象设计原则

    里氏替换原则的定义 里氏替换原则:继承必须确保超类所拥有的性质在子类中仍然成立 里氏替换原则抓哟阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中蕴含的道理.里氏替 ...

  8. 里氏替换原则_春辉带你了解面相对象设计第二原则(里氏替换原则)

    里氏替换原则的定义 里氏替换原则(Liskov Substitution Principle,LSP)由麻省理工学院计算机科学实验室的里斯科夫(Liskov)女士在 1987 年的"面向对象 ...

  9. 软件设计原则之里氏替换原则、依赖倒置原则

    系列文章目录 软件设计原则之单一职责原则.开闭原则 软件设计原则之里氏替换原则.依赖倒置原则 软件设计原则之接口隔离原则.合成复用原则.迪米特原则 文章目录 系列文章目录 一.里氏替换原则 什么是里氏 ...

  10. 【设计模式】软件设计七大原则 ( 里氏替换原则 | 定义 | 定义扩展 | 引申 | 意义 | 优点 )

    文章目录 一.里氏替换原则定义 二.里氏替换原则定义扩展 三.里氏替换原则引申意义 四.里氏替换原则意义 五.里氏替换原则优点 一.里氏替换原则定义 里氏替换原则定义 : 如果 对每一个 类型为 T1 ...

最新文章

  1. myeclipse莫名其妙的问题
  2. Nagios+Centreon+Nrpe集成(二)
  3. torch拼接合并 cat优化记录
  4. uni-app 使用vue的语法+小程序的标签和API。
  5. 在Linux操作系统下使用虚拟光驱的方法
  6. 学习FreeRTOS的几点体会
  7. 一句话了解 v-show 和 v-if 的区别
  8. 通过stream去重_分享几种 Java8 中通过 Stream 对列表进行去重的方法
  9. (转)C++类所占内存大小计算
  10. C_北理工乐学_结构
  11. 修改配色 Mac电脑默认命令行工具(终端\terminal) MacBook Pro MacBook
  12. PCA:详细解释主成分分析
  13. 如何了解百度竞价调价技巧
  14. 推荐一款个人资料管理软件(免费,Wizknowledge)
  15. Alibaba Code代码索引技术实践:为Code Review提供本地IDE的阅读体验
  16. 洗牌问题(C语言实现)
  17. 个人作品展示与软件下载
  18. 《战略人力资源管理》
  19. asp mysql dw_dw怎么制作asp动态网页之向数据库增加记录?
  20. puzzle(0334)纸面魔方

热门文章

  1. git merge 与 git rebase的区别
  2. LeetCode 594. Longest Harmonious Subsequence
  3. 接口简介 java 1614100890
  4. ImageList控件 图片容器控件 1130
  5. 包的实际操作 java
  6. django-自关联-三级联动的效果
  7. Java 多线程(一)
  8. 一看就懂的例子告诉你用react-redux的正确姿势
  9. 好记性不如烂笔杆-android学习笔记十一 Service的应用
  10. NextCloud Installation on CentOS 7 server