里氏替换原则(Liskov Substitution Principle) LSP
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace LiskovSubstitutionPrinciple
- {
- //里氏替换原则(Liskov Substitution Principle) LSP
- //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,
- //the behavior of P is unchanged when o1 is substituted for o2 than S is a subtype of T.
- //(如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有对象o1都替换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。)
- //通俗点讲,只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者根本不需要知道是父类还是子类。
- //但是反过来就不行了,有子类出现的地方,父类未必能适应(因为子类可能存在自己的方法属性,父类并不知道呀)。
- class Program
- {
- static void Main(string[] args)
- {
- Square square = new Square();
- //隐式转换,只要父类Shape能出现的地方子类就可以出现
- Shape shape = new Rectangle(, );//替换为子类也不会产生任何错误或异常,这是因为子类肯定继承了父类的方法属性。
- //显示转换
- Shape shape2 = (Shape)square;
- //只要父类Shape能出现的地方子类square、rectangle就可以出现
- GetShapeArea(shape);
- GetShapeArea(shape2);
- GetShapeArea(square);
- //只要父类IDisposable能出现的地方子类square、rectangle就可以出现
- DisposeShape(shape);
- DisposeShape(shape2);
- DisposeShape(square);
- }
- static public void GetShapeArea(Shape shape)
- {
- //得益于LSP,我们不用知道实际的子类是什么,提高了扩展性
- Console.WriteLine(shape.Name + "的面积为" + shape.GetArea());
- }
- //同理,继承接口也是一种继承,暂且认为接口IDisposable也是父类吧~
- static public void DisposeShape(IDisposable obj)
- {
- obj.Dispose();
- }
- }
- /// <summary>
- /// 有抽象方法的类一定是抽象类,抽象类自身不能被实例化。
- /// 继承增强了耦合,父类在进行改动时,要考虑子类的修改,不然全部子类都要重构!
- /// </summary>
- public abstract class Shape : IDisposable
- {
- private string name;
- public string Name
- {
- get { return name; }
- set { name = value; }
- }
- private int width;
- public int Width
- {
- get { return width; }
- set { width = value; }
- }
- private int height;
- public int Height
- {
- get { return height; }
- set { height = value; }
- }
- //子类一定要实现抽象方法
- public abstract int GetArea();
- public void Dispose()
- {
- Console.WriteLine(Name + "释放掉了");
- }
- }
- /// <summary>
- /// 正方形,继承Shape使得我们代码重用,减少工作量。
- /// </summary>
- public class Square : Shape
- {
- public Square(int width)
- {
- Name = "Square";
- Width = width;
- //继承虽好,但是只要继承,就必须拥有父类的所有属性和方法,这里的Height对于正方形来说其实没有存在的必要,因为四边都相等呐。
- Height = width;
- }
- //我们只需实现抽象方法,其他东西一律继承!~
- public override int GetArea()
- {
- return Width * Height;
- }
- }
- /// <summary>
- /// 长方形
- /// </summary>
- public class Rectangle : Shape
- {
- public Rectangle(int width, int height)
- {
- Name = "Rectangle";
- Width = width;
- Height = height;
- }
- public override int GetArea()
- {
- return Width * Height;
- }
- }
- }
里氏替换原则(Liskov Substitution Principle) LSP的更多相关文章
- 里氏代换原则(Liskov Substitution Principle,LSP)
第一种定义: 如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换为o2,程序P的行为没有发生变化,那么类型S是类型T的子类型. 第二种定义: 所有引 ...
- 里氏替换原则(Liskov Substitution Principle,LSP)
肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑.其实原因就是这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的. 定义1:如果对每一 ...
- 设计模式六大原则(二):里氏替换原则(Liskov Substitution Principle)
里氏替换原则(LSP)由来: 最早是在 妖久八八 年, 由麻神理工学院得一个女士所提出来的. 定义: 1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 ...
- 面象对象设计原则之三:里氏替换原则(The Liskov Substitution Principle,LSP)
里氏代换原则由2008年图灵奖得主.美国第一位计算机科学女博士Barbara Liskov教授和卡内基·梅隆大学Jeannette Wing教授于1994年提出.其严格表述如下:如果对每一个类型为S的 ...
- 设计模式原则(2)--Liskov Substitution Principle(LSP)--里氏替换原则
1.定义: 所有引用基类(父类)的地方必须能透明地使用其子类的对象.这一原则与继承紧密相关.如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的 ...
- 面向对象设计原则 里氏替换原则(Liskov Substitution Principle)
里氏替换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一. 里氏替换原则中说,任何基类可以出现的地方,子类一定可以出现. LSP是继承复用的基石,只 ...
- 【面向对象设计原则】之里氏替换原则(LSP)
里氏代换原则由2008年图灵奖得主.美国第一位计算机科学女博士Barbara Liskov教授和卡内基·梅隆大学Jeannette Wing 教授于1994年提出,所以使用的是这位女博士的性命名的一个 ...
- 面向对象五大原则_1.单一职责原则&2.里氏替换原则
单一职责原则:Single Responsibility Principle (SRP) 一个类.仅仅有一个引起它变化的原因.应该仅仅有一个职责.每个职责都是变化的一个轴线.假设一个类有一个以上的职责 ...
- 里氏替换原则(Liskov Substitution Principle)
开放封闭原则(Open Closed Principle)是构建可维护性和可重用性代码的基础.它强调设计良好的代码可以不通过修改而扩展,新的功能通过添加新的代码来实现,而不需要更改已有的可工作的代码. ...
- Java设计原则之里氏替换原则
里氏代换原则由2008年图灵奖得主.美国第一位计算机科学女博士Barbara Liskov教授和卡内基·梅隆大学Jeannette Wing教授于1994年提出.其严格表述如下:如果对每一个类型为S的 ...
随机推荐
- 排序算法汇总(java实现,附源代码)
整理系统的时候发现了原来写的各种算法的总结,看了一下,大吃一惊,那时候的我还如此用心,具体的算法,有的已经模糊甚至忘记了,看的时候就把内容整理出来,顺便在熟悉一下,以后需要的时候就可以直接过来摘抄了. ...
- C#winform拖动无边框窗体
private bool isMouseLeftKeyDown = false; private Point mousePointToClient = new Point();//相对于本窗体鼠标位置 ...
- 去掉html标签方法
public static string CleanHtml(string strHtml) { strHtml = Regex.Replace(strHtml, @"(\<scrip ...
- c# 根据文件夹或文件名返回(文件夹或文件)的完整路径
c# 根据文件夹或文件名返回(文件夹或文件)的完整路径 一.方案一:(使用windows API) 二.方案二:(扫描全盘)
- 八、Node.js-http模块
JS代码如下: /* 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi,来处理客户端的请求相应. 不过对 N ...
- 【02】循序渐进学 docker:如何安装
写在前面的话 我们接下来的操作都是 CentOS 7.5 以下完成的,为了避免你我结果不一致,建议你也采用 CentOS 7.5,原因如下: 1. 个人几年工作下来经历的公司,包括身边的运维朋友,90 ...
- [转]解读Unity中的CG编写Shader系列1——初识CG
CG=C for Graphics 用于计算机图形编程的C语言超集 前提知识点: 1.CG代码必须用 CGPROGRAM ... ENDCG括起来 2.顶点着色器与片段着色器的主函数名称可随意,但需 ...
- Mybatis 延迟加载策略
延迟加载: 就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据.延迟加载也称懒加载. 好处: 先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速 ...
- 如何安装memcached
软件的下载,好像从官网上只能下载未经编译的源码,需要自己编译后才能安装使用,不熟悉的用户还是直接百度搜索下载比较好,这里也提供一个下载地址给大家参考. www.newasp.net/soft/6373 ...
- OOP1(定义基类和派生类)
面向对象程序设计基于三个基本概念:数据抽象,继承和动态绑定 数据抽象是一种依赖于接口和实现分离的编程技术.继承和动态绑定对程序的编号有两方面的影响:一是我们可以更容易地定义与其它类相似但不完全相同的类 ...