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

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

BlueHost主机商年中618活动全场低至五折

BlueHost 主机商在以前做外贸网站的时候还是经常会用到的,想必那时候有做外贸网站或者是选择海外主机的时候还是较多会用BlueHost主机商的。只不过这些年云服务器流行且性价比较高,于是大家可选择商家变多,但是BlueHost在外贸主机用户群中可选的还是比较多的。这次年中618活动大促来袭,毕竟BLUEHOST商家目前中文公司设立在上海,等后面有机会也过去看看。他们也会根据我们的国内年中促销发...

ReliableSite怎么样,月付$95美国洛杉矶独立服务器

ReliableSite怎么样?ReliableSite好不好。ReliableSite是一家成立于2006年的老牌美国商家,主要经营美国独立服务器租赁,数据中心位于:洛杉矶、迈阿密、纽约,带宽1Gbps起步,花19美元/月即可升级到10Gbps带宽,月流量150T足够各种业务场景使用,且免费提供20Gbps DDoS防护。当前商家有几款大硬盘美国独服,地点位于美国洛杉矶或纽约机房,机器配置很具有...

TMThosting:VPS月付55折起,独立服务器9折,西雅图机房,支持支付宝

TMThosting发布了今年黑色星期五的促销活动,即日起到12月6日,VPS主机最低55折起,独立服务器9折起,开设在西雅图机房。这是一家成立于2018年的国外主机商,主要提供VPS和独立服务器租用业务,数据中心包括美国西雅图和达拉斯,其中VPS基于KVM架构,都有提供免费的DDoS保护,支持选择Windows或者Linux操作系统。Budget HDD系列架构CPU内存硬盘流量系统价格单核51...

里氏代换原则为你推荐
ipv6无网络访问权限本地连接IPv4 IPv6无网络访问权限诺诺云代账诺诺云代账有什么优势?rownumbersql server 2005中row_number怎么用spawningVC中Error spawning cl.exe错误的解决方法.ruby语言Ruby语言输入方法法问卷星登陆你好,如果之前用微信登录了问卷星小程序,以后每次回答都不需要微信登录了吗?回答了会被知道个人信息吗问卷星登陆问卷星的使用步骤图片存储怎么设置图片的保存类型pci数据捕获和信号处理控制器华硕pci数据捕获和信号处理控制器出现黄色叹号该下载什么驱动什么是SOA什么是中子刀?您了解吗?
新通用顶级域名 淘宝抢红包攻略 唯品秀 香港机房 Vultr mediafire下载工具 seovip lamp配置 howfile 什么是服务器托管 美国在线代理服务器 中国电信测速网 paypal注册教程 网站在线扫描 登陆空间 沈阳主机托管 路由跟踪 starry 免费网络 免费个人主页 更多