【设计模式攻略】OO设计原则之LSP-Liskov替换原则
来源:互联网 发布:mac上好用的作图软件 编辑:程序博客网 时间:2024/04/30 06:26
概要
什么是所谓的替换原则?开发中我们通常会通过继承实现一些子类来达到功能的扩展,比如假设我们有基类B,有个B类型的指针或引用作为某个函数的参数,这时我们创建了子类C继承于B,如果当把指向C类对象的指针作为参数传递时,出现了一些意料之外的异常时,它就违反了LSP。说的有点抽象,到实例再具体说明。
目的
子类类型完全能替换基类类型而不会发生异常
实例与效果
举个LSP经典的例子来说明下吧。比如我们有个Rectangle,可以设定长和宽,同时可以计算它的面积,我们还有正方形的需求,所以我们创建一个Square类,继承于Rectangle。具体实现如下:
class Rectangle {public: virtual void SetWidth(int w) { mWidth = w; } virtual void SetHeigth(int h) { mHeigth = h; } virtual int GetArea() { return mWidth * mHeigth; }protected: int mWidth; int mHeigth;};class Square extends Rectangle {public: virtual void SetWidth(int w) { mWidth = w; mHeigth = h; } virtual void SetHeigth(int h) { mHeigth = h; mWidth = w; }};
是不是觉得做得挺好,貌似没有什么问题?好,略微分析一下吧。比如我们一般会通过工厂类来获得Rectangle*类型的对象,而在一些条件下用户可能并不知道或者并不关心当前指针是指向什么类型的对象(Rectangle?Square?),这时候问题就来了。假设工厂类方法声明为:
Rectangle* RecFactory::GetInstance();//(static)
调用的代码如下:
Rectangle* rec = RecFactory.GetInstance();rec->SetWidth(10);rec->SetHeigth(20);int area = rec->GetArea();
当getInstance返回的是指向Square 的对象时,调用方可能觉得结果应该是200,而实际结果却是400。原因很明显,正方形Square的行为特性跟Rectangle不同,导致SetWidth,SetHeigth的行为跟基类的行为特性不一致,最终出现异常的结果。LSP就是这么一回事。
- 【设计模式攻略】OO设计原则之LSP-Liskov替换原则
- Liskov Substitution Principle (LSP) - OO设计的里氏替换原则
- OO设计原则 -- Liskov Substitution Principle: OO设计的LSP里氏替换原则
- OO设计原则 -- Liskov Substitution Principle: OO设计的LSP里氏替换原则
- OO设计原则 -- Liskov Substitution Principle: OO设计的LSP里氏替换原则
- IOS设计模式的六大设计原则之里氏替换原则(LSP,Liskov Substitution Principle)
- Liskov替换原则(LSP)LSPLiskov Substitution Principle(里氏替换原则) --- 设计模式原则
- OO设计原则 OO设计的LSP里氏替换原则
- 面向对象设计原则一:LisKov替换原则(LSP)
- 面向对象设计原则:LisKov替换原则(LSP)
- 面向对象设计原则:LisKov替换原则(LSP)
- 设计原则-里氏替换原则(Liskov Substitution Principle LSP)
- 设计模式六大原则之Liskov替换原则
- 设计模式六大原则(2):里氏替换原则LSP(Liskov Substitution Principle)
- Liskov替换原则(LSP)
- Liskov替换原则(LSP)
- Liskov替换原则--LSP
- Liskov替换原则--LSP
- 信息资源管理第六章——上锁
- JSON-lib框架,转换JSON、XML不再困难
- Nike智能腕带FuelBand :为你打造健康身体
- 自动换行的class
- 技术普及帖:你刚才在淘宝上买了一件东西
- 【设计模式攻略】OO设计原则之LSP-Liskov替换原则
- Oracle 11g R2 安装时提示找不到em.ear
- LINQ to XML类
- sql优化
- 系统广播大全
- 好久没用Mysql了,终于找到data目录了
- Android4.0.3修改启动动画和开机声音
- APK安装过程及原理详解
- SGU512