网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.通过动态编译获取字符串表达的值.
.Struts 用户指南.
.XML 和 JAVA.
.tomcat中文问题--过滤器.
.Think in java Stream 经典.
.Servlet技巧ABC.
.用JBuilder 9 开发一个文本编辑器.
.Hibernate中的Middlegen入门指南.
.WirelessMessagingAPI(1).
.Java中利用Reflection API优化代.
.2005年Java十大热点问题揭晓.
.用EJB开发在线课堂.
.简析J2EE应用程序数据库类设计模.
.EJB设计模式1.
.Java虚拟机CACAO 0.95 .
.在目录中查找类位于哪个jar包中.
.Flex开发步骤——配置过程总结.
.用Filter实现IP过滤.
.JBuilder2005实现重构之升级到JD.
.安全性和类载入程序体系结构.

一些面向对象的设计法则(4)

发表日期:2008-1-5



  法则4:Liskov替换法则(LSP)
  
  使用指向基类(超类)的引用的函数,必须能够在不知道具体派生类(子类)对象类型的情况下使用它们。
  
  [ Function Thar Use Referennces To Base(Super) Classes Must Be Able To Use Objects
  Of Derived(Sub) Classes Without Knowing It ]
  
  
  
  
  
  
  
  
  Liskov替换法则
  
  
  
  
  
  
  1.显而易见,Liskov替换法则(LSP)是根据我所熟知的"多态"而得出的。
  
  2.例如:
  
  
  
  方法drawShape应该可与Sharp超类的任何子类一起工作(或者,若Sharp为Java接口,则该方法可与任何实现了Sharp接口的类一起工作)
  
  但是当我们在实现子类时必须要谨慎对待,以确保我们不会无意中违反了LSP。
  
  
  
  
  
  
  
  
  3.若一个函数未能满足LSP,那么可能是因为它显式地引用了超类的一些或所有子类。这样的函数也违反了OCP,因为当我们创建一个新的子类时,会不得不进行代码的修改。
  
  
  
  
  
  
  
  
  
  LSP示例
  
  
  
  
  
  
  1. 考虑下面Rectangle类:
  
   一些面向对象的设计法则(4)(图一)
  
  2.现在,Square类会如何呢?显然,一个正方形是一个四边形,因此Square类应该从Rectangle类派生而来,对否?让我们看一看!
  
  3.观察可得:
  
  a.正方形不需要将高和宽都作为属性,但是总之它将继续自Rectangle。因此,每一个Square对象会浪费一点内存,但这并不是一个主要问题。
  
  b.继续而来的setWidth()和setHeight()方法对于Square而言并非真正地适合,因为一个正方形的高和宽是相同。因此我们将需要重写setWidth()和setHeight()方法。不得不重写这些简单的方法有可能是一种不恰当的继续使用方式。
  
  
  
  3.Square类如下:
  
   一些面向对象的设计法则(4)(图二)
  
  4. 看起来都还不错。但是让我们检验一下!
  
   一些面向对象的设计法则(4)(图三)
  
   一些面向对象的设计法则(4)(图四)
  
  5. 测试程序输出:
  
  一些面向对象的设计法则(4)(图五)
  
  6.看上去似乎我们违反了LSP!
  
  
  
  7.这里的问题出在哪里呢?编写testLsp()方法的程序员做了一个合理的假设,即改变Rectangle的宽而保持它的高不变。
  
  8.在将一个Square对象传递给这样一个方法时产生了问题,显然是违反了LSP
  
  9.Square和Rectangle类是相互一致和合法的。尽管程序员对基类作了合理的假设,但其所编写的方法仍然会导致设计模型的失败。
  
  10.不能孤立地去看待解决方案,必须根据设计用户所做的合理假设来看待它们。
  
  
  
  11. 一个数学意义上的正方形可能是一个四边形,但是一个Square对象不是一个Rectangle对象,因为一个Square对象的行为与一个Rectangle对象的行为是不一致的!
  
  12.从行为上来说,一个Square不是一个Rectangle!一个Square对象与一个Rectangle对象之间不具有多态的特征。
  
  
  
  
  
  
  
  
  
  
  
  
  
  总结
  
  
  
  
  
  
  1.Liskov替换法则(LSP)清楚地表明了ISA关系全部都是与行为有关的。
  
  2.为了保持LSP(并与开放-封闭法则一起),所有子类必须符合使用基类的client所期望的行为。
  
  3.一个子类型不得具有比基类型(base type)更多的限制,可能这对于基类型来说是合法的,但是可能会因为违反子类型的其中一个额外限制,从而违反了LSP!
  
  4.LSP保证一个子类总是能够被用在其基类可以出现的地方!
上一篇:VB.NET和Java的OOP设计 人气:680
下一篇:一些面向对象的设计法则(3) 人气:436
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐