有没有帮忙做网站,wordpress后台403,互联网网站建设哪里好,怎么在百度搜索自己的网站阐述#xff1a;子类型#xff08;subtype#xff09;必须能够替换掉它们的基类型#xff08;basetype#xff09; 先提出一个问题#xff1a;正方形是不是一种特殊的长方形#xff08;IS - A关系#xff09;#xff1f; 先不要回答这个问题#xff0c;看下面的分析。…阐述子类型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