【设计模式系列】OO设计原则之LSP-Liskov替换原则
生活随笔
收集整理的這篇文章主要介紹了
【设计模式系列】OO设计原则之LSP-Liskov替换原则
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
概要 什么是所謂的替換原則?開(kāi)發(fā)中我們通常會(huì)通過(guò)繼承實(shí)現(xiàn)一些子類來(lái)達(dá)到功能的擴(kuò)展,比如假設(shè)我們有基類B,有個(gè)B類型的指針或引用作為某個(gè)函數(shù)的參數(shù),這時(shí)我們創(chuàng)建了子類C繼承于B,如果當(dāng)把指向C類對(duì)象的指針作為參數(shù)傳遞時(shí),出現(xiàn)了一些意料之外的異常時(shí),它就違反了LSP。說(shuō)的有點(diǎn)抽象,到實(shí)例再具體說(shuō)明。
目的 子類類型完全能替換基類類型而不會(huì)發(fā)生異常
實(shí)例與效果 舉個(gè)LSP經(jīng)典的例子來(lái)說(shuō)明下吧。 比如我們有個(gè)Rectangle,可以設(shè)定長(zhǎng)和寬,同時(shí)可以計(jì)算它的面積,我們還有正方形的需求,所以我們創(chuàng)建一個(gè)Square類,繼承于Rectangle。具體實(shí)現(xiàn)如下:
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;} };
是不是覺(jué)得做得挺好,貌似沒(méi)有什么問(wèn)題?好,略微分析一下吧。比如我們一般會(huì)通過(guò)工廠類來(lái)獲得Rectangle*類型的對(duì)象,而在一些條件下用戶可能并不知道或者并不關(guān)心當(dāng)前指針是指向什么類型的對(duì)象(Rectangle?Square?),這時(shí)候問(wèn)題就來(lái)了。假設(shè)工廠類方法聲明為: Rectangle* RecFactory::GetInstance();//(static)
調(diào)用的代碼如下: Rectangle* rec = RecFactory.GetInstance(); rec.SetWidth(10); rec.SetHeigth(20); int area = rec.GetArea();
當(dāng)getInstance返回的是指向Square?的對(duì)象時(shí),調(diào)用方可能覺(jué)得結(jié)果應(yīng)該是200,而實(shí)際結(jié)果卻是400。原因很明顯,正方形Square的行為特性跟Rectangle不同,導(dǎo)致SetWidth,SetHeigth的行為跟基類的行為特性不一致,最終出現(xiàn)異常的結(jié)果。LSP就是這么一回事。
目的 子類類型完全能替換基類類型而不會(huì)發(fā)生異常
實(shí)例與效果 舉個(gè)LSP經(jīng)典的例子來(lái)說(shuō)明下吧。 比如我們有個(gè)Rectangle,可以設(shè)定長(zhǎng)和寬,同時(shí)可以計(jì)算它的面積,我們還有正方形的需求,所以我們創(chuàng)建一個(gè)Square類,繼承于Rectangle。具體實(shí)現(xiàn)如下:
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;} };
是不是覺(jué)得做得挺好,貌似沒(méi)有什么問(wèn)題?好,略微分析一下吧。比如我們一般會(huì)通過(guò)工廠類來(lái)獲得Rectangle*類型的對(duì)象,而在一些條件下用戶可能并不知道或者并不關(guān)心當(dāng)前指針是指向什么類型的對(duì)象(Rectangle?Square?),這時(shí)候問(wèn)題就來(lái)了。假設(shè)工廠類方法聲明為: Rectangle* RecFactory::GetInstance();//(static)
調(diào)用的代碼如下: Rectangle* rec = RecFactory.GetInstance(); rec.SetWidth(10); rec.SetHeigth(20); int area = rec.GetArea();
當(dāng)getInstance返回的是指向Square?的對(duì)象時(shí),調(diào)用方可能覺(jué)得結(jié)果應(yīng)該是200,而實(shí)際結(jié)果卻是400。原因很明顯,正方形Square的行為特性跟Rectangle不同,導(dǎo)致SetWidth,SetHeigth的行為跟基類的行為特性不一致,最終出現(xiàn)異常的結(jié)果。LSP就是這么一回事。
轉(zhuǎn)載于:https://www.cnblogs.com/secbook/archive/2012/03/31/2655130.html
總結(jié)
以上是生活随笔為你收集整理的【设计模式系列】OO设计原则之LSP-Liskov替换原则的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php中区分大小写的超全局变量总结
- 下一篇: 如何使用MFC和类型库创建自动化项目