五大原则之----里氏替换原则(LSP) - pjh123 - 博客园.pdfVIP

五大原则之----里氏替换原则(LSP) - pjh123 - 博客园.pdf

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2016/11/13 五大原则之里氏替换原则 (LSP) - pj h123 - 博客园 五大原则之里氏替换原则 (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对象。 (二)、特殊情况呢?   回到最初的问题,正方形是不是矩形的问题。 /peij ihui/archive/2012/04/07/2436133.html 1/3 2016/11/13 五大原则之里氏替换原则 (LSP) - pj h123 - 博客园 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、基于契约进行设计。     每个类设计时,都会有一些假设,每个方法,都有前置条件,后置条件,这些条件都是契约。对这些方法,要注明契 约。     要想从基类派生子类,就必须满足这些契约。如果不满足这些契约,就不能继承出子类。 (即使他们看起来很像,比 /peij ihui/archive/2012/04/07/2436133.html 2/3

文档评论(0)

JuanHuang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档