里氏代换原则在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;

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

LOCVPS:美国XEN架构VPS七折,全场八折,日本/新加坡XEN架构月付29.6元起

LOCVPS发来了针对XEN架构VPS的促销方案,其中美国洛杉矶机房7折,其余日本/新加坡/中国香港等机房全部8折,优惠后日本/新加坡机房XEN VPS月付仅29.6元起。这是成立较久的一家国人VPS服务商,目前提供美国洛杉矶(MC/C3)、和中国香港(邦联、沙田电信、大埔)、日本(东京、大阪)、新加坡、德国和荷兰等机房VPS主机,基于XEN或者KVM虚拟架构,均选择国内访问线路不错的机房,适合建...

无忧云:洛阳BGP云服务器低至38.4元/月起;雅安高防云服务器/高防物理机优惠

无忧云怎么样?无忧云,无忧云是一家成立于2017年的老牌商家旗下的服务器销售品牌,现由深圳市云上无忧网络科技有限公司运营,是正规持证IDC/ISP/IRCS商家,主要销售国内、中国香港、国外服务器产品,线路有腾讯云国外线路、自营香港CN2线路等,都是中国大陆直连线路,非常适合免备案建站业务需求和各种负载较高的项目,同时国内服务器也有多个BGP以及高防节点。一、无忧云官网点击此处进入无忧云官方网站二...

Ceranetworks顶级合作伙伴 香港E3 16G 299元 香港E5 32G 650元 美国E3 16G 650元

提速啦(www.tisula.com)是赣州王成璟网络科技有限公司旗下云服务器品牌,目前拥有在籍员工40人左右,社保在籍员工30人+,是正规的国内拥有IDC ICP ISP CDN 云牌照资质商家,2018-2021年连续4年获得CTG机房顶级金牌代理商荣誉 2021年赣州市于都县创业大赛三等奖,2020年于都电子商务示范企业,2021年于都县电子商务融合推广大使。资源优势介绍:Ceranetwo...

里氏代换原则为你推荐
pcbetawindows7 7127下载洗牌算法c语言编程用扑克牌洗牌和发牌foxmail邮箱注册如何注册一个foxmail邮箱oncontextmenu如何禁用ImageButton的右键?最开放的浏览器用的最多的三个浏览器是?查字网拐字换什么偏旁 成新字mindmanager破解版xmind mac破解版哪个好用bindservice如何启动和停止用servicedeviceidAndroid里DeviceId和AndroidId都是什么意思?拓扑关系简述空间数据的拓扑关系及其对GIS数据处理和空间分析有何重要意义?
日本动态vps 希网动态域名 鲜果阅读 铁通流量查询 上海域名 hostker 合租空间 泉州电信 nerds 爱奇艺vip免费试用7天 最漂亮的qq空间 申请网站 上海电信测速 秒杀品 防cc攻击 免费个人主页 睿云 万网服务器 汤博乐 winds 更多