【设计模式系列】OO设计原则之LSP-Liskov替换原则
生活随笔
收集整理的這篇文章主要介紹了
【设计模式系列】OO设计原则之LSP-Liskov替换原则
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
概要 什么是所謂的替換原則?開發中我們通常會通過繼承實現一些子類來達到功能的擴展,比如假設我們有基類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就是這么一回事。
目的 子類類型完全能替換基類類型而不會發生異常
實例與效果 舉個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就是這么一回事。
轉載于:https://www.cnblogs.com/secbook/archive/2012/03/31/2655130.html
總結
以上是生活随笔為你收集整理的【设计模式系列】OO设计原则之LSP-Liskov替换原则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php中区分大小写的超全局变量总结
- 下一篇: 如何使用MFC和类型库创建自动化项目