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

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

RAKsmart推出7.59美元/月,云服务器产品Cloud Server,KVM架构1核1G内存40G硬盘1M带宽基础配置

近期RAKsmart上线云服务器Cloud Server产品,KVM架构1核1G内存40G硬盘1M带宽基础配置7.59美元/月!RAKsmart云服务器Cloud Server位于美国硅谷机房,下单可选DIY各项配置,VPC网络/经典网络,大陆优化/精品网线路,1-1000Mbps带宽,支持Linux或者Windows操作系统,提供Snap和Backup。RAKsmart机房是一家成立于2012年...

阿里云香港 16核32G 20M 999元/月

阿里云香港配置图提速啦是成立于2012年的十分老牌的一个商家这次给大家评测的是 阿里云香港 16核32G 20M 这款产品,单单说价格上就是十分的离谱原价8631元/月的现价只要 999元 而且还有个8折循环优惠。废话不多说直接进入正题。优惠时间 2021年8月20日-2021年9月20日 优惠码 wn789 8折优惠阿里云香港BGP专线 16核32G 10M带宽 优惠购买 399元购买链接阿里云...

RAKsmart裸机云/云服务器/VPS全场7折,独立服务器限量秒杀$30/月起

适逢中国农历新年,RAKsmart也发布了2月促销活动,裸机云、云服务器、VPS主机全场7折优惠,新用户注册送10美元,独立服务器每天限量秒杀最低30.62美元/月起,美国洛杉矶/圣何塞、日本、香港站群服务器大量补货,1-10Gbps大带宽、高IO等特色服务器抄底价格,机器可选大陆优化、国际BGP、精品网及CN2等线路,感兴趣的朋友可以持续关注下。裸机云新品7折,秒杀产品5台/天优惠码:Bare-...

里氏代换原则为你推荐
google邮箱注册怎样创建google邮箱deviceidAndroid里DeviceId和AndroidId都是什么意思?ruby语言Ruby是一种什么样的语言,主要用来做什么,现在有一家公司让我从java转ruby,我很犹豫?弹幕网站视频弹幕网站推荐弹幕网站谁能给我解释一下什么叫A站,什么叫B站?都是啥网站?layoutsubviews如何设置plus.nativeui.toast的样式清除电脑垃圾怎样清除电脑垃圾菜霸保险是传销吗?基础设施即服务基础设施是什么意思啊?watch的过去式watch的过去式能不能加三单形式?
万网域名空间 荷兰vps 七牛优惠码 hkbn 56折 轻博 大容量存储器 服务器维护方案 怎样建立邮箱 世界测速 佛山高防服务器 四川电信商城 沈阳主机托管 百度云空间 日本代理ip 德讯 测试网速命令 卡巴斯基官网下载 中国电信宽带测速 碳云 更多