里氏替换原则(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的 ...
随机推荐
- Graph cut使用方法
下载:http://www.wisdom.weizmann.ac.il/~bagon/matlab.html 1. 运行compile_gc.m 2.运行gc_example.m(必须同目录吗?!) ...
- 编写高质量代码改善C#程序的157个建议——建议14: 正确实现浅拷贝和深拷贝
建议14: 正确实现浅拷贝和深拷贝 为对象创建副本的技术称为拷贝(也叫克隆).我们将拷贝分为浅拷贝和深拷贝. 浅拷贝 将对象中的所有字段复制到新的对象(副本)中.其中,值类型字段的值被复制到副本中后, ...
- 设计模式09: Decorator 装饰模式(结构型模式)
Decorator 装饰模式(结构型模式) 子类复子类,子类何其多加入我们需要为游戏中开发一种坦克,除了不同型号的坦克外,我们还希望在不同场合中为其增加以下一种多种功能:比如红外线夜视功能,比如水路两 ...
- delphi 指针 认识
delphi 指针分为类型指针和无类型指针: 类型指针分为PChar.PInteger.PString等. 无类型指针Pointer. PPChar/PP...为指针的指针 @和Addr一样,为获取变 ...
- 2014-4-2解决无法访问github和google的问题
github是个好地方,但是上不去就蛋疼了. 今天github上不去,果断f12下,看下network,发现里面好多请求都是指向 github.global.ssl.fastly.net这个域名的,然 ...
- docker webapi
dockerfile FROM microsoft/aspnetcore:2.0 COPY . /docker1 WORKDIR /docker1 EXPOSE ENTRYPOINT ["d ...
- MySQL参数log_bin_trust_function_creators
问题:执行创建函数的sql文件报错如下: [Err] 1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA ...
- 金庸笔下的"程序员" | 附金庸武侠全集
金庸 飞雪连天射白鹿,笑书神侠倚碧鸳当您八十高龄取得牛津大学唐朝史学博士学位,我还以为这是另一部史诗开始的信号,然而没有后续了.我的高中到大学,是十遍<笑傲江湖>的距离,我的整个青春,是大 ...
- 【guava】字符串操作
一,Strings类 public void testStrings(){ Strings.isNullOrEmpty("");//返回true Strings.nullToEmp ...
- Jenkins持续集成企业实战系列之Jenkins持续集成简介及安装-----02
1. Jenkins持续集成简介 注:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 最初接触Jenkins也是由于公司需求, ...