LSP原则—关于正方形不是长方形】的更多相关文章

长方形有二个属性长和宽.并有一个设置长的方法和设置宽的方法,还有一个求面积的方法. 像下面 private int length; private int width; public void setLength(int lenght) { this.length = lenght; } public void setWidth(int width) { this.width= width; } public int getArea() { return this.length * this.w…
LSP是唯一一个以人名命名的设计原则,并且作者还是一个"女博士"  ============================================================= LSP,Liskov substitution principle,中文翻译为"里氏替换原则". 这是面向对象原则中唯一一个以人名命名的原则,尽管Liskov在中国的知名度没有UNIX的几位巨匠(Kenneth Thompson.Dennis Ritchie).GOF四人帮那么…
如果这篇文章能够帮到您,请给我一个免费的赞,谢谢QWQ! LSP原则并不难,但是地方就会把它说的很啰嗦,如果你对LSP还是感到疑惑,请往下看看. 先上代码: public class Bird { public void fly(){} }public class Duck extends Bird{} 乍一看,这段代码没啥问题.没错啊,鸭子是鸟,当然鸭子也会飞了! 可是我举个反例:鸵鸟不是鸟吗?那鸵鸟会飞吗?明显不会. 但鸵鸟也是鸟啊,我如果让我的鸵鸟做鸟的子类,那我按你这么写必须会飞了,这不…
里氏代换原则(Liskov Substitution Principle, LSP) 1 什么是里氏代换原则 里氏代换原则是由麻省理工学院(MIT)计算机科学实验室的Liskov女士,在1987年的OOPSLA大会上发表的一篇文章<Data Abstraction and Hierarchy>里面提出来的,主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中的蕴涵的原理.2002年,我们前面单一职责原则中提到的软件工程大师Robert C. Martin,…
2. 里氏替换原则(Liskov Substitution Principle,LSP) 2.1 定义 (1)所有使用基类的地方必须能透明地使用子类替换,而程序的行为没有任何变化(不会产生运行结果错误或异常).只有这样,父类才能被真正复用,而且子类也能够在父类的基础上增加新的行为.也只有这样才能正确的实现多态 (2)当一个类继承了另一个类时,子类就拥有了父类中可以继承下来的属性和操作.但如果子类覆盖了父类的某些方法,那么原来使用父类的地方就可能会出现错误,因为表面上看,它调用了父类的方法,但实际…
子类的对象提供了父类的所有行为,且加上子类额外的一些东西(可以是功能,可以是属性).当程序基于父类实现时,如果将子类替换父类而程序不需修改,则说明符合LSP原则. 这个解释看的似懂非懂,再看下面更进一步的解释: 函数使用指向父类的指针或引用时,必须能够在不知道子类类型的情况下使用子类的对象. 子类必须能够替换成它们的父类 这其中存在这样的概念:方法调用者(C)和方法提供者(P).C调用P提供的方法,P的方法返回给C处理的结果.中间的过程C是不需要知道,也不会知道的.当C调用P的方法时,如果将P替…
OCP背后的主要机制是抽象和多态.在静态类型语言中,比如C++和Java,支持抽象和多态的关键机制之一是继承.正是使用了继承,才可以创建实现其基类中抽象方法的派生类.是什么设计规则在支配着这种特殊的继承用法呢?最佳的继承层次的特征又是什么呢?怎样的情况会使我们创建的类层次结构掉进不符合OCP的陷阱中去呢?这些正是Liskov替换原则(LSP)要解答的问题. 1. 定义 对于LSP可以做如下解释:子类型(subtype)必须能够替换掉它们的基类型(base type)Barbara Liskov首…
定义: 如果对每一个对类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型. 内容: 里氏替换原则通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能.它包含以下4层含义: 1.子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法. 2.子类中可以增加自己特有的方法. 3.当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松. 4.当子类的方法实现…
一.什么是里氏代换原则 里氏代换原则(Liskov Substitution Principle): 一个软件实体如果使用的是一个父类的话,那 么一定适用于其子类,而且它察觉不出父类和子 类对象的区别.也就是说,在软件里面,把父类 替换成它的子类,程序的行为没有变化. 二.反过来的代换不成立 里氏代换原则(Liskov Substitution Principle): 一个软件实体如果使用的是一个子类的话,那 么它不能适用于其父类. 三.企鹅是鸟类吗?? 四.正方形是一种长方形吗?? 正方形不是…
前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第3篇,里氏替换原则LSP(The Liskov Substitution Principle ). 英文原文:http://freshbrewedcode.com/derekgreer/2011/12/31/solid-javascript-the-liskov-substitution-principle/ 开闭原则的描述是: Subtypes must be substitutable for their ba…
OCP中,继承支持了抽象和多态特性. LSP:子类必须能够替换掉其基类. 反例:使用if/else判断类型,以便选择针对特定类型的正确行为. 有效性并非本质属性 模型的有效性,只能通过它的客户程序来表现. 在考虑一个特定设计是否合理时,必须要根据该设计的使用者所作出的合理假设来审视它. 这些合理的假设常常就是单元测试中的assert. 不要试图做所有的假设,而只是优先预测那些明显的对于LSP原则的违反情况,而在相关的脆弱性臭味出现时,才做其他的预测. IS-A是关于行为方式的. 对象的行为方式才…
里氏替换原则LSP(Liskov Subsituation Principle) 里氏替换原则定义 所有父类出现的地方可以使用子类替换并不会出现错误或异常,但是反之子类出现的地方不一定能用父类替换. LSP的四层含义 子类必须完全实现父类的方法 子类可以自己的个性(属性和方法) 覆盖或实现父类的方法时输入参数可以被放大 覆盖或实现父类的方法时输出结果可以被缩小 LSP的定义含义1--子类必须完全实现父类的方法 假设如下场景:定义一个枪支抽象类,一个场景类,三个枪支实现类,一个士兵类.此处,三个枪…
霍夫变换 霍夫变换是1972年提出来的,最开始就是用来在图像中过检测直线,后来扩展能检测圆.曲线等. 直线的霍夫变换就是 把xy空间的直线 换成成 另一空间的点.就是直线和点的互换. 我们在初中数学中了解到,一条直线可以用如下的方程来表示:y=kx+b,k是直线的斜率,b是截距. 我们转换下变成:b=-kx+y.我们是不是也可以把(k,b)看作另外一个空间中的点?这就是k-b参数空间. 这样,我们就把一条x-y直线用一个(k,b)的点表示出来了. 我们看到,在x-y图像空间中的一个点,变成了k-…
n*n的正方形网格中有横竖各n+1条直线,其中,任意各取两条都可以组成一个长方形﹙正方形也是长方形﹚.所以长方形个数为C﹙n+2,2﹚×C﹙n+2,2﹚=﹙n+1﹚²n²/4个.如果正方形不算,则N=﹙n+1﹚²n²/4-[1²+2²+……+n²]=﹙n+1﹚²n²/4-n﹙n+1﹚﹙2n+1﹚/6个例如4×4的正方形网格中有长方形100个.其中狭义长方形70个.…
洛谷P2241-统计方形 题目描述: 有一个 \(n \times m\) 方格的棋盘,求其方格包含多少正方形.长方形(不包含正方形). 思路: 所有方形的个数=正方形的个数+长方形的个数.对于任意一个\(x\times y\)的矩形,以这个方形右下角的那个块作为要在矩形内选择正方形\长方形的右下角,则正方形的个数为\(min(x,y)\),长方形的个数为\(x*y\). 解释如下:对于一个\(x\times y\)的矩形,右下角的块必选,则能和这个块组成的正方形的右上角块全在这个主对角线上,而…
开放封闭原则(Open Closed Principle)是构建可维护性和可重用性代码的基础.它强调设计良好的代码可以不通过修改而扩展,新的功能通过添加新的代码来实现,而不需要更改已有的可工作的代码.抽象(Abstraction)和多态(Polymorphism)是实现这一原则的主要机制,而继承(Inheritance)则是实现抽象和多态的主要方法. 那么是什么设计规则在保证对继承的使用呢?优秀的继承层级设计都有哪些特征呢?是什么在诱使我们构建了不符合开放封闭原则的层级结构呢?这些就是本篇文章将…
1.  开闭原则(Open-Closed Principle,OCP) 1)定义:一个软件实体应当对扩展开放,对修改关闭( Software entities should be open for extension,but closed for modification.).即在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展. 2)满足“开-闭”原则的系统的优点: a)通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性. b…
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4260969.html 接口(纯粹的抽象类) ... 4 什么是接口 ... 4 接口与类的区别 ... 5 为什么要使用接口 ... 5 抽象类 ... 5 什么是抽象类 ... 5 抽象类的用…
1  概述 本章叙述面向向对象设计的七大原则,七大原则分为:单一职责原则.开闭原则.里氏替换原则.依赖倒置原则.接口隔离原则.合成/聚合复用原则.迪米特法则. 2  七大OO面向对象设计 2.1 单一职责原则SRP(Simple Responsibility Principle) 单一职责原则,就是一个设计元素只做一件事.什么是“只做一件事”?就是少管闲事.现实中也是如此,如果让一个人认真的去做一件事,那么任何人都有信心可以做到很出色.就一个类而言,应该仅有一个引起它变化的原因,如果你能想到两个…
在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据7条原则来开发程序,从而提高软件开发效率,节约软件开发成本和维护成本. 这7条原则分别是:开闭原则.里氏替换原则.依赖倒置原则.单一职责原则.接口隔离原则.迪米特法则.合成复用原则. 接下来是对这7个原则的详细介绍. 开闭原则(OCP,Open Closed Principle) 定义 开闭原则(Open Closed Principle,OCP)由勃兰特·梅耶(Bertrand Meyer)提出,他…
文章转载自:http://blog.csdn.net/anders_zhuo/article/details/8949566 设计模式遵循的一般原则: 1.开-闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开发,对修改关闭.说的是,再设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展.换言之,应当可以在不必修改源代码的情况下改变这个模块的行为,在保持系统一定稳定性的基础上,对系统进行扩展.这是面向对象设计(OOD)的基石,也是最重要的原则. 2…
学习这个设计模式 真的觉得很抽象,只有自己多多的领会! 在很多时候,很多的知识都会觉得讲起来是很矛盾的. 本章目标 1 掌握内聚度和耦合度的概念 2 掌握面向对象设计原则  (一)如何衡量软件设计的质量 内聚度:表示一个应用程序的单个单元所负责的任务数量和多样性.内聚与单个类或者单个方法单元相关.(在我自己的理解就是:在一个类中完成自己所有的任务,这些任务都在自己的类中.自己的事情自己做) 耦合度:耦合度表示类之间关系的紧密程度.耦合度决定了变更一个应用程序的容易程度.在紧密耦合的类结构中,更改…
2016-05-14 20:45:38 设计模式到底是五大.六大还是七大,一直傻傻分不清楚,网上总是有说那些原则可以归为一个,我纠结了半天,突然发现自己是舍本逐末了,只要清楚这些原则的设计思想,其他的理解自然是水到渠成. 1.开放-封闭原则 2.单一职责原则 3.里氏代换原则 4.依赖倒转原则 5.迪米特法则 6.接口隔离原则 7.合成/聚合复用原则 一.开放封闭原则(open-closed principle) 一个软件实体应当对外拓展开放,对修改关闭. 在设计一个模块时,应当使得这个模块可以…
设计模式遵循的一般原则: 1.开-闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开发,对修改关闭.说的是,再设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展.换言之,应当可以在不必修改源代码的情况下改变这个模块的行为,在保持系统一定稳定性的基础上,对系统进行扩展.这是面向对象设计(OOD)的基石,也是最重要的原则. 2.里氏代换原则(Liskov Substitution Principle,常缩写为.LSP) (1).由Barbar Lis…
为什么要有设计原则,我觉得一张图片就可以解释这一切 一.单一职责原则(SRP) 对于一个类而言,应该只有一个发生变化的原因.(单一职责不仅仅是指类) 如果一个模块需要修改,它肯定是有原因的,除此原因之外,如果遇到了其他情况,还需要对此模块做出修改的话,那么就说这个模块就兼具多个职责.举个栗子: 此时我们有个动物类Animal,有个Move()会移动的方法 public class Animal { //动物移动的方法 public void Move(String name) { Console…
作者 | Jeskson来源 | 达达前端小酒馆 1 主要学习JavaScript中的六大原则.那么六大原则还记得是什么了吗?六大原则指:单一职责原则(SRP),开放封闭原则(OCP),里氏替换原则(LSP),依赖倒置原则(DIP),接口分离原则(ISP),最少知识原则(LKP). 单一职责原则开放封闭原则里氏替换原则依赖倒置原则接口分离原则最少知识原则 那么什么是单一职责原则呢?单一职责原则,英文单词为:single responsable princple,原则体现为,一个对象或者是方法只做…
北风设计模式课程---里氏替换原则(Liskov Substitution Principle) 一.总结 一句话总结: 当衍生类能够完全替代它们的基类时:(Liskov Substitution Principle)则是实现 OCP 原则的重要方式.只有当衍生类能够完全替代它们的基类时,使用基类的函数才能够被安全的重用,然后衍生类也可以被放心的修改了. 1.违背 LSP 原则的一个简单示例(这样设计的不好之处是什么)? |||-begin 一个非常明显地违背 LSP原则的示例就是使用 RTTI…
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8287784.html,记录一下学习过程以备后续查用. 写代码也是有原则的,我们之所以使用设计模式,主要是为了适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.如果我们能更好的理 解这些设计原则,对我们理解面向对象的设计模式也是有帮助的,因为这些模式的产生是基于这些原则的. 设计原则包括:单一职责原则(SRP).开闭原则(OCP).里氏替换原则(LSP).依赖倒置原则(DIP).接口隔离原则(ISP…
最近通读了<架构整洁之道>,受益匪浅,遂摘选出设计原则部分,与大家分享,希望大家能从中获益. 以下为书中第3部分 设计原则的原文. 设计原则概述 通常来说,要想构建-个好的软件系统,应该从写整洁的代码开始做起.毕竟,如果建筑所使用的砖头质量不佳,那么架构所能起到的作用也会很有限.反之亦然,如果建筑的架构设计不佳,那么其所用的砖头质量再好也没有用.这就是SOLID设计原则所要解决的问题. SOLID原则的主要作用就是告诉我们如何将数据和函数组织成为类,以及如何将这些类链接起来成为程序.请注意,这…
面向对象的SOLID原则 简介 缩写 全称 中文 S The Single Responsibility Principle 单一责任原则 O The Open Closed Principle 开放封闭原则 L Liskov Substitution Principle 里氏替换原则 I The Interface Segregation Principle 接口分离原则 D The Dependency Inversion Principle 依赖倒置原则 单一职责原则 一个类只应承担一种责…