五大原则之----里氏替换原则(LSP)

阐述:子类型(subtype)必须能够替换掉它们的基类型(basetype)

 

先提出一个问题:正方形是不是一种特殊的长方形(IS - A关系)?

先不要回答这个问题,看下面的分析。

 

理解:LSP原则的一个例子,假如有个people的基类,两个字类man类和woman类,都继承于people类。那么针对people类的任何操作,比如fun吃饭、fun睡觉、fun走路,对于man类和woman类都成立。这个很好理解,不管是man还是woman,归根结底,还都是一个people。

(一)正常思维

如下例子:

 

class CShape
{
public:
 CShape(void);
 ~CShape(void);
public:
 virtual void Draw();
};

class CCircle:public CShape
{
public:
 CCircle(void);
 ~CCircle(void);
public:
 virtual void Draw();
};

class CSquare:public CShape
{
public:
 CSquare(void);
 ~CSquare(void);
public:
 virtual void Draw();
};

 

在使用CShape对象的任何地方,都可以使用CCircle对象或者CSquare对象。

 

(二)、特殊情况呢?

 回到最初的问题,正方形是不是矩形的问题。

如下类:

class CRectangle
{
public:
 CRectangle(void);
 ~CRectangle(void);
protected:
 int  width;
 int  height;
};

class CSquare:public CRectangel
{
public:
 CSquare(void);
 ~CSquare(void);
};

 

假如有个函数

void g(CRectangle * r)

{

    r.width = 4;

    r.height = 5;

    if( r.Area() != 20)

       break;

}

请问,对于函数g来说,能用一个CSquare对象,代替CRectangle对象吗?很明显,不能!

很明显,违反了LSP原则。

那么,正方形到底是不似乎矩形呢?也就是说CSquare和CRectangle之间,是否存在(IS - A)关系呢?

解释:

1、从属性方面讲,正方形是矩形,是一种特殊矩形,即width = height;

2、从行为方式将,正方形可能不是矩形。

    比如,对于函数g来说,描述了矩形的一种行为方式,很明显,正方形不符合这种行为方式。

 

    OOD中的IS-A关系,是就行为方式而言的,行为方式是可以进行合理假设的。而行为方式,才是我们进行面向对象软件设计真正所关注的问题。

    因此,可以讲,正方形不是一个矩形


 

 

(三)、怎么处理此类问题呢?

1、基于契约进行设计。

    每个类设计时,都会有一些假设,每个方法,都有前置条件,后置条件,这些条件都是契约。对这些方法,要注明契约。

    要想从基类派生子类,就必须满足这些契约。如果不满足这些契约,就不能继承出子类。(即使他们看起来很像,比如正方形与矩形)

2、但是我们又需要LSP原则,怎么办呢?

    从CRectangle类和CSquare类,提取出公共部分,做为一个基类。比如CShape类。

    CRectangle和CSquare都继承自CShape类。

     具体一些例子,参考《敏捷软件开发》相关章节

 

 

 

 

 

转载于:https://www.cnblogs.com/peijihui/archive/2012/04/07/2436133.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学学得好,才可以发现别人发现不了的挣钱良机

全世界有3.14 % 的人已经关注了数据与算法之美2011年,美国波士顿地区的一种彩票 “Cash WinFal”爆出了一个存在已久的漏洞。让人惊奇的是,一对 73 岁的夫妇已经利用这个漏洞赚了超过 600 万美元 。一时间风雨满城,马萨诸塞州也宣布要开始调查…

java富文本如何转义_富文本编辑器wangEditor中转义字符的问题

前段时间做项目的时候,要使用富文本编辑器,采用的是wangEditor,结果当用户在为文本添加样式的时候,发现居然无法直接保存,遂查看后台数据。发现很多样式都被过滤掉了,后台接受的数据中根本没有样式。在网上…

Async和Await异步编程的原理

1. 简介 从4.0版本开始.NET引入并行编程库,用户能够通过这个库快捷的开发并行计算和并行任务处理的程序。在4.5版本中.NET又引入了Async和Await两个新的关键字,在语言层面对并行编程给予进一步的支持,使得用户能以一种简洁直观的方式实现并行…

Lang.NEXT 2012相关Session

2012年4.2-4日的Lang.NEXT 2012是.NET(CLR, DLR 以及其他平台)上语言及相关工具的设计开发者的盛会。会议的相关Session已经放出,绝对值得好好的学习,地址是:http://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2012?sortsequential&…

细数那些让人难以抗拒的经典数学书

如果有人不相信数学是简单的,那是因为他们没有意识到人生有多复杂。——冯诺依曼近期有关数学的好消息还是蛮多的,先有阿里巴巴举办全国数学竞赛,奖金百万,只为爱好数学的你。快来看看下面这些竞赛试题,我想应该难不倒我们的小伙伴…

java对jar包的复制_Java安全之jar包调试技巧

Java安全之jar包调试技巧调试程序首先还是创建一个工程,将jar包导入进来调试模式的参数启动中需要加入特定参数才能使用debug模式,并且需要开放调试端口JDK5-8:-agentlib:jdwptransportdt_socket,servery,suspendy,address5005JDK9:-agentlib…

最近忙的事

最近忙于背ccna题库,实际上。。我基本上感觉是中文背两次英文的还要看两次,这样才行。至于实验,貌似。。不敢去碰,因为每次做同一个实验遇到的问题那可是都不一样啊。还有。。四级,还有。。论文等等,说起来…

一次Redis client组件性能分析

BeetleX也扩展了RedisClient驱动,写这些高并发应用的驱动性能测试分析是必不可少的。在最近一次测试中发现测试采样度不足,引起的一些问题;通过这一次的问题也警醒一下自己在以后设计上要考虑更多细节的特性需求。发现问题在写组件的时候往往…

男生追女生的超强数学建模分析

全世界有3.14 % 的人已经关注了数据与算法之美问题分析男生追女生,对男生来说最重要的是学习、爱情两不误。因此我们引进男生的学业成绩函数Y(t)。首先,我们不考虑男生的追求攻势,则影响该函数的因素主要是两个人的关系程度。为了便于分析&am…

java设计模式face_java设计模式之-------原型模式

一、模式定义用原型实例指定要创建对象的种类,并通过拷贝这些原型创建新的对象。二、模式场景假设此处结合23中设计模式记忆篇作出假设,不关心逻辑是否合理。柳岩在跳舞的时候烧伤了脸,再也回不到原来的型状。他就克隆一张脸。类图如下&#…

乐观锁与悲观锁各自适用场景是什么?

机制乐观锁是一种思想,具体实现是,表中有一个版本字段,第一次读的时候,获取到这个字段。处理完业务逻辑开始更新的时候,需要再次查看该字段的值是否和第一次的一样。如果一样更新,反之拒绝。之所以叫乐观&a…

你被这些网络迷题难倒过吗?

全世界有3.14 % 的人已经关注了数据与算法之美消失的正方形这是数学游戏大师马丁加德纳在《从惊讶到思考》一书中提到过的例子。重新摆放分割的小块图形后,上面的正方形中少了一个小方格,它去了哪里?我们不妨实际操作一下,做两个全…

tplink-wr841n无线路由接入到局域网三层交换机方法

把tplink-wr841n无线路由接入到局域网三层交换机方法:1.设置无线路由wan口动态获取IP,获取上级三层交换机分配的IP。不与本地局域网一个网段。2.设无线路由的lan口IP为管理IP,与wan口在不同一网段。WAN口IP地址和LAN口IP地址不能处于同一子网&#xff0c…

php值比较大小,PHP_PHP浮点比较大小的方法,本文实例讲述了PHP浮点比较大 - phpStudy...

PHP浮点比较大小的方法本文实例讲述了PHP浮点比较大小的方法。分享给大家供大家参考,具体如下:/*** 浮点数一般是不能用来比较大小的,但是我们可以用一种变通的的方式* 用var_dump输出浮点是看不出效果的,可以用serialize查看* 1.round 2.浮点…

温故知新,.Net Core遇见Blazor(FluentUI),属于未来的SPA框架

什么是BlazorBlazor是一个使用.NET生成交互式客户端WebUI的框架:使用C#代替JavaScript来创建信息丰富的交互式UI。共享使用.NET编写的服务器端和客户端应用逻辑。将UI呈现为HTML和CSS,以支持众多浏览器,其中包括移动浏览器。与新式托管平台(如…

看来要先拒绝37%的女人,才能找到真爱

全世界有3.14 % 的人已经关注了数据与算法之美在每期《非诚勿扰》节目上,面对一位位男嘉宾,24位单身女生要做出不止一次“艰难的决定”:到底要不要继续亮灯?把灯灭掉意味着放弃了这一次机会,继续亮灯则有可能结束节目之…

Java程序员从笨鸟到菜鸟之(三十)javascript弹出框、事件、对象化编程

一:弹出框 JavaScript中有三种弹出框:警告(alert)、确认(confirm)以及提问(prompt)。 1.警告(alert) 在访问网站的时候,你遇到“咚”的一声,一个小窗口出现在你面前,上面写着一段警示性的文字,或是其它的提示信息。如…

php如何将页面嵌入在另一盒子里,如何将一个盒子在显示在浏览器的正中间_html/css_WEB-ITnose...

1、通过CSS来实现1)position: absolute; top:50%; left:50%; margin-left:-101px; margin-top:-101px;2) position:absolute; left:0; top:0; right:0; bottom:0; margin:auto;2、通过JS来实现说明 在普通文档流里,margin: auto; 的意思是设置元素的margin-top和mar…

.Net日志之nlog

1. 介绍NLog是适用于各种.NET平台&#xff08;包括.NET标准&#xff09;的灵活&#xff0c;免费的日志记录平台&#xff0c;支持数据库、文件、控制台。2. 输入到文件2.1 引用nuget包<PackageReference Include"NLog" Version"4.7.6" /><PackageR…

为了证明自己有多能喝,理工科的学生竟做出这种事

全世界有3.14 % 的人已经关注了数据与算法之美当酒鬼止不住地说“我没有醉”、“再来一杯”的时候&#xff0c;他基本上已经醉得不行了。此时&#xff0c;他会说出一堆毫无逻辑的话&#xff0c;让旁人听了不知所云。这就是最为常见的酒鬼形象了。直到某一天&#xff0c;死理性派…