里氏代换原则在c#中可以体现里氏替换原则的关键操作字是什么?只想知道操作字是什么!不要解释一大堆乱七八糟的东西!

里氏代换原则  时间:2021-07-16  阅读:()

里氏代换原则的示例

LSP讲的是基类和子类的关系。

只有当这种关系存在时,里氏代换关系才存在。

如果两个具体的类A,B之间的关系违反了LSP的设计,(假设是从B到A的继承关系)那么根据具体的情况可以在下面的两种重构方案中选择一种。

-----创建一个新的抽象类C,作为两个具体类的超类,将A,B的共同行为移动到C中来解决问题。

-----从B到A的继承关系改为委派关系。

C# 举个例子说说里氏替换原则

里氏代换原则(Liskov Substitution Principle LSP)是面向对象设计的基本原则之一。

里氏代换原则中说,任何基类可以 出现的地方,子类一定可以出现。

LSP是继承复用的基石,只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在 父类的基础上增加新的行为。

里氏代换原则是对“开-闭”原则的补充。

实现“开-闭”原则的关键步骤就是抽象化。

而基类与子类的继承关系就是抽象化的具体实 现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

下面举例说明什么是里代换原则 实例1 正方形不是长方形 在几何当中,正方形肯定是长方形,只不过它是特殊的长方形,四条边都相等,利用面向对象的继承关系,我们让正方形继承长方形,代码如下: // C#讲解里氏代换原则 // 实例名称:正方形不是长方形 using System; // 长方形类 class Rectangle { int length; int width; public int getLength() { return length; } public int getWidth() { return width; } public virtual void setLength(int length) { this.length = length; } public virtual void setWidth(int width) { this.width = width; } } // 正方形类Square class Square : Rectangle { public override void setLength(int length) { base.setLength(length); base.setWidth(length); } public override void setWidth(int width) { base.setLength(width); base.setWidth(width); } } /* * 由于正方形的长度和宽度必须相等,所以在方法setLength和setWidth中, * 对长度和宽度赋值相同。

类TestRectangle是我们的软件系统中的一个组件, * 它有一个resize方法要用到基类Rectangle,resize方法的功能是模拟长方形宽度逐步增长的效果 */ //测试类TestRectangle class TestRectangle { // 此方法改变长方形的宽,将宽设为比高大 static void resize(Rectangle objRect) { Console.WriteLine("设置宽度开始"); while(objRect.getWidth() <= objRect.getLength() ) { objRect.setWidth( objRect.getWidth () + 1 ); } Console.WriteLine("设置宽度结束"); } static void Main() { // 实例化一个长方形 Rectangle r=new Rectangle(); // 设长为10 r.setLength(10); // 设宽为1 r.setWidth(1); Console.WriteLine("长方形"); Console.WriteLine("改变之前长为:"+r.getLength()); Console.WriteLine("改变之前宽为:"+r.getWidth()); // 调用方法改变长方形的宽 resize(r); // 改变之后 Console.WriteLine("改变之后长为:"+r.getLength()); Console.WriteLine("改变之后宽为:"+r.getWidth()); Rectangle s=new Square(); s.setLength(10); s.setWidth(1); Console.WriteLine("正方形"); Console.WriteLine("改变之前长为:"+s.getLength()); Console.WriteLine("改变之前宽为:"+s.getWidth()); // 调用方法改变正方形的宽 resize(s); Console.WriteLine("改变之后长为:"+s.getLength()); Console.WriteLine("改变之后宽为:"+s.getWidth()); } } 我们运行一下这段代码就会发现,假如我们把一个普通长方 形的实例作为参数传入resize方法,就会看到长方形宽度逐渐增长的效果,当宽度大于长度,代码就会停止,这种行为的结果符合我们的预期;假如我们利用 里氏代换所说的,把子类的实例赋给父类,再把父类(正方形)的实例作为参数传入resize方法后,就会看到正方形的宽度和长度都在不断增长,代码会一直 运行下去,直至系统产生溢出错误。

所以,普通的长方形是适合这段代码的,正方形不适合。

我们得出结论:在resize方法中,Rectangle类型的参数是不能被Square类型的参数所代替,如果进行了替换就得不到预期结果。

因 此,Square类和Rectangle类之间的继承关系违反了里氏代换原则,它们之间的继承关系不成立,正方形不是长方形。

当运行程序的时候,长方形可以正常的改变长方形的宽度,而正方形不能改变宽度。

里氏代换原则说明了我们不能乱用继承,这里长方形的长和宽和正方形的长和宽 明显有不同的特点,所以正方形继承长方形是错误的,正确的写法是我们可以把正方形和长方形抽象出来,再让正方形和长方形继承这个抽象类,从而这两个类互不 影响,各实现各的功能。

参考:/jiaping0424/article/details/6683478 望采纳, 谢谢.

在c#中可以体现里氏替换原则的关键操作字是什么?只想知道操作字是什么!不要解释一大堆乱七八糟的东西!

int a = 10; object o = a as object; int b = (int)o;

是没有关键字的,主要是看你是否理解面向对象的思想。

BGP.TO日本和新加坡服务器进行促销,日本服务器6.5折

BGP.TO目前针对日本和新加坡服务器进行促销,其中日本东京服务器6.5折,而新加坡服务器7.5折起。这是一家专门的独立服务器租售网站,提供包括中国香港、日本、新加坡和洛杉矶的服务器租用业务,基本上都是自有硬件、IP资源等,国内优化直连线路,机器自动化部署上架,并提供产品的基本管理功能(自助开关机重启重装等)。新加坡服务器 $93.75/月CPU:E3-1230v3内存:16GB硬盘:480GB ...

CYUN专注海外精品服务器资源 国庆钜惠 最低5折起 限量促销

国庆钜惠 最低5折起 限量促销CYUN专注海外精品服务器资源,主营香港CN2 GIA、美国CERA、美国高防服务器资源,实体公司,ISP/IDC资质齐全,客服配备齐全。本次针对国庆推出非常给力的促销活动,旗下所有平台同享,新老客户同享,限时限量,售完截止。活动截止时间:2021年10月9日官网地址:www.cyun.net参与机型:香港CN2 GIA云服务器、香港双程CN2云服...

Sharktech($49/月),10G端口 32GB内存,鲨鱼机房新用户赠送$50

Sharktech 鲨鱼机房商家我们是不是算比较熟悉的,因为有很多的服务商渠道的高防服务器都是拿他们家的机器然后部署高防VPS主机的,不过这几年Sharktech商家有自己直接销售云服务器产品,比如看到有新增公有云主机有促销活动,一般有人可能买回去自己搭建虚拟主机拆分销售的,有的也是自用的。有看到不少网友在分享到鲨鱼机房商家促销活动期间,有赠送开通公有云主机$50,可以购买最低配置的,$49/月的...

里氏代换原则为你推荐
ISDNisdn是什么意思foxmail邮箱注册Foxmail怎么注册喏?查字网“很”去掉双人旁读什么?qq注册账号用QQ注册有几种方法?天融信防火墙天融信下一代防火墙有那些特点和优势?数秦科技安徽数智通科技有限公司怎么样?有b吗有什么好看的b级片ruby语言ruby什么意思?什么含义?layoutsubviews如何设置plus.nativeui.toast的样式图片存储怎么设置图片的保存类型
域名服务器的作用 个人域名备案 动态域名解析软件 godaddy域名解析教程 ipage linode日本 cpanel主机 godaddy域名转出 网通ip 老左正传 1g空间 服务器干什么用的 双12 web服务器是什么 台湾google 国外在线代理服务器 wordpress中文主题 申请免费空间 万网空间 金主 更多