Liskov替换原则(LSP)

Liskov替换原则(The Liskov Substitution Principle)

子类型(subtype)必须能够替换掉它们的基类型(base type)。

一个违反LSP的简单例子

public class AntiLspDemo {public void drawShape(final Shape shape) {if (shape.getItsType() == ShapeType.Square) {final Square square = (Square) shape;square.draw();} else if (shape.getItsType() == ShapeType.Circel) {final Circle circle = (Circle) shape;circle.draw();}}
}enum ShapeType {/*** 正方形.*/Square,/*** 圆形.*/Circel
}class Point {private double x;private double y;// get/set...
}class Shape {private ShapeType itsType;/*** 获取itsType.* @return the itsType*/public ShapeType getItsType() {return itsType;}/*** 设置itsType.* @param newItsType the itsType to set*/public void setItsType(ShapeType newItsType) {itsType = newItsType;}}class Circle extends Shape {private Point itsCenter;private double itsRadius;public Circle() {this.setItsType(ShapeType.Circel);}public void draw() {System.out.println("绘制Circle...");}
}class Square extends Shape {private Point itsTopLeft;private double itsSide;public Square() {this.setItsType(ShapeType.Square);}public void draw() {System.out.println("绘制Square...");}
}

正方形和矩形,更微妙的违规

        我们经常说继承是IS-A(“是一个”)关系。如果一个新类型的对象被认为和一个已有类的对象之间满足IS-A关系,那么这个新对象的类应该从这个已用对象的类派生。

        一个正方形是一个矩形,所以Square类就应该派生在Rectangle类。不过,这将带来一些微妙但极为值得重视的问题。

public class Rectangle {/*** 左上角坐标.*/private Point topLeft;/*** 宽度.*/private double width;/*** 高度.*/private double height;/*** 获取topLeft.* @return the topLeft*/public Point getTopLeft() {return topLeft;}/*** 设置topLeft.* @param newTopLeft the topLeft to set*/public void setTopLeft(Point newTopLeft) {topLeft = newTopLeft;}/*** 获取width.* @return the width*/public double getWidth() {return width;}/*** 设置width.* @param newWidth the width to set*/public void setWidth(double newWidth) {width = newWidth;}/*** 获取height.* @return the height*/public double getHeight() {return height;}/*** 设置height.* @param newHeight the height to set*/public void setHeight(double newHeight) {height = newHeight;}}public class Square extends Rectangle {public void setWidth(double width) {super.setWidth(width);super.setHeight(width);}public void setHeight(double height) {super.setWidth(height);super.setHeight(height);}
}

真正的问题

        Square类没有违反正方形的不变性,但是Square派生自Rectangle,Square类违反了Rectangle类的不变性。

public void g(Rectangle r) {r.setWidth(5);r.setHeight(4);assert(r.area() == 20)
}

有效性并非本质属性

        一个模型,如果孤立地看,并不具有真正意义上的有效性。模型的有效性只能通过它的Client程序来体现。这又是一个实践TDD的好理由。

IS-A是关于行为的

        对于那些不是g的调用者而言,正方形可以是长方形,但是从g的角度,Square对象绝对不是Rectangle对象。Square对象的行为方式和函数g所期望的Rectangle对象的行为方式不相容。从行为方式的角度来看,Square不是Rectangle,对象的行为方式才是软件真正所关注的。

基于契约设计

        基于契约设计(Design By Contract),类的编写者显示地规定针对该类的契约。契约是通过为每个方法声明的前置条件(preconditions)和后置条件(postconditions)来指定的。要执行一个方法,前置条件必须为真。执行完毕后,保证后置条件为真。 

Rectangle.setWidth(double w)的后置条件:
assert((width == w) && (height == old.height));

        派生类的前置条件和后置条件规则是:

在重新声明派生类中的例程(routine)时,

只能使用相等或更弱的前置条件,只能使用相等或更强的后置条件

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

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

相关文章

谷歌放出AI平民化大招: 李飞飞宣布推出AutoML云平台,让普通企业也能用上深度学习

作者:杨晓凡概要:谷歌云机器学习平台(Google Cloud AI)自从上线以来就以预训练的、可以直接调用的高效机器学习模型吸引了许多企业级用户在其上构建简单的机器学习应用。谷歌云机器学习平台(Google Cloud AI&#xff0…

php 强制返回,php – 我可以强制抽象类的方法返回一些东西吗?

在PHP中,你不能“强制”一个方法来返回任何东西 – 即使使用抽象类/方法,也不可能使用接口.您可以做的最好的事情是表明实现应该返回一些内容,使用注释 – 但您不能强迫人们这样做:/*** param string $a blah blah* return int The return value blah blah*/public …

AI博弈论:DeepMind让智能体在非对称博弈中找纳什均衡

Root 林鳞 编译自 DeepMind官方博客量子位 出品 | 公众号 QbitAI随着人工智能系统在现实世界中扮演越来越重要的角色,理解不同的系统如何相互作用至关重要。刚刚,DeepMind发表了一篇名为Symmetric Decomposition of Asymmetric Games的论文。在这篇论文中…

php ie 下载 乱码,php ie下载文件名乱码怎么办

php ie下载文件名乱码的解决办法:1、通过header方法解决乱码;2、通过“function remote_filesize($uri,$user,$pw) {...}”等方法解决乱码。php文件下载IE文件名乱码问题一直用chrome浏览器,没发现问题。今天用ie6,发现文件下载时…

无人驾驶技术排名:百度居中游,苹果特斯拉垫底 | 行业

来源:网易科技概要:其调查研究显示,无人驾驶汽车行业的现状已经发生了天翻地覆的变化,而特斯拉、苹果公司在今年的排名垫底。1月17日消息,据CNET网站报道,日前,美国市场研究机构Navigant Resear…

h5 换脸 php,【部分原创】python实现视频内的face swap(换脸)

1.准备工作,按博主的环境为准Python 3.5Opencv 3Tensorflow 1.3.1Keras 2cudnn和CUDA,如果你的GPU足够厉害并且支持的话,可以选择安装那就先安装起来,有兴趣的朋友给我个暗示,好让我有动力写下去,想实现整套…

接口隔离原则(ISP)

接口隔离原则(The Interface Segregation Interface) 这个原则用来处理“胖(fat)”接口(类的接口不是内聚的)所具有的缺点。“胖”接口可以分解成多组方法。 考虑一个安全系统,有一些Door对象&a…

马歇尔·赫伯特:人工智能的前沿技术与实例分析

来源:中国人工智能学会2017年12月11日,国际知名机器人专家、美国卡耐基梅隆大学机器人研究所所长马歇尔赫伯特(Martial Hebert)教授和首席科学家大卫伯恩(David Bourne)教授访问了中国科学技术大学参观中科大机器人实验室并作演讲。演讲人简介&#xff1…

php xssclean,php – Codeigniter xss_clean困境

基本上XSS是一个OUTPUT问题 – 但Codeigniter将其作为INPUT问题处理.Can someone elaborate how it’s bad…问题是xss_clean会改变你的INPUT – 这意味着在某些情况下(比如你所描述的密码问题)输入不是预期的.…or at least give 1 most probable scenario where it can be ex…

ActiveMQ消费者平滑关闭

平滑关闭的思路就是让正在执行的任务线程正常执行完毕,然后再关闭JVM。在JVM关闭之前触发一个shutdown hook,jvm自带这个hook,在java启动时候就可以注册这样的hook。 ##1、简述JVM关闭钩子(shutdown hook) 首先JVM的关…

二叉堆时间复杂度 php,二叉堆(Binary Heap)

二叉堆这个数据结构有点意思,自己做了个总结,内容结构如下:二叉堆性质二叉堆操作应用二叉堆性质:堆(Heap)是一个可以被看成近似完全二叉树的结构,具有完全二叉树的特性:缺少的叶子节点总是位于右子节点n个节…

产业丨一文读懂人工智能产业链,未来10年2000亿美元市场

来源:国防科技信息网概要:针对人工智能产业链,主要有三个核心:基础技术、人工智能技术及人工智能应用,本文将从主要从这三个方面进行梳理。人工智能(Artificial Intelligence),英文缩…

Java获取并Kill系统进程

原理:获取系统所有进程列表,遍历,然后进行模糊匹配,将匹配到的进程杀死! 作用:保证在系统中只有一个程序进程实例。 /*** 确保系统中只有一个程序实例* 1.如果客户端启动前,操作系统中有残留进…

2017年高性能计算领域的成功与失败

来源:中科院信息科技战略情报概要:2017年,机器学习和各种人工智能应用在高性能计算领域持续发挥着重要影响力。2017年12月9日,TOP500官网刊文总结了高性能计算在2017年取得的新进展,以及未来发展趋势,主要内…

php保存rar,php 解压rar文件

对于zip文件网上的例子很多,rar文件解压php没有直接支持,可以用pecl 到http://pecl.php.net/package/rar 下载对应版本的 非线程安全的dll 然后扔到php的 ext目录下。 打开php.ini. 加一行 extensionphp_rar.dll 重启web服务器 和php public function _u…

ProcessBuilder执行bash脚本

我正在尝试从Java执行bash脚本,它返回错误/ bin / bash:’/ home / nika / NetBeansProjects / Parallel Framework / process-executor.sh’:没有这样的文件或目录,我正在使用ubuntu使用netbeans8& 14.04 jdk8. 这是我的代码: public …

php读取云平台数据库,读取Read · ThinkPHP5+数据库和模型 · 看云

#### Db类实现读取单个记录~~~$user Db::table(user)->where(id, 1)->find();//或者$user Db::table(user)->find(1);echo $user[id];echo $user[name];~~~模型实现读取单个记录要比Db类简单很多,而且更加符合对象的设计。~~~$user User::get(1);echo $…

Science封面:谁动了我的DNA?原来是你拿去做机器人了

来源:机器人大讲堂概要:慕尼黑工业大学的Friedrich C. Simmel团队使用DNA分子,组装出了一个可以远程控制的纳米机械臂,并用它成功推动了一个纳米金颗粒。本周《Science》期刊的封面故事,介绍了一款德国制造的灵活DNA手…

Process 执行shell 脚本

概述: Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序)。 Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉&a…

中国倒数第五!毕马威全球自动驾驶报告|附下载

来源:智东西概要:指向高效、安全的自动驾驶被认为是未来汽车形态,渐渐融入到各国汽车发展战略中去,科技公司和传统车企纷纷入局。指向高效、安全的自动驾驶被认为是未来汽车形态,渐渐融入到各国汽车发展战略中去&#…