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