古詩詞大全網 - 四字成語 - C# 舉個例子說說裏氏替換原則

C# 舉個例子說說裏氏替換原則

裏氏代換原則(Liskov Substitution Principle LSP)是面向對象設計的基本原則之壹。 裏氏代換原則中說,任何基類可以

出現的地方,子類壹定可以出現。 LSP是繼承復用的基石,只有當子類可以替換掉父類,軟件單位的功能不受到影響時,父類才能真正被復用,而子類也能夠在

父類的基礎上增加新的行為。裏氏代換原則是對“開-閉”原則的補充。實現“開-閉”原則的關鍵步驟就是抽象化。而基類與子類的繼承關系就是抽象化的具體實

現,所以裏氏代換原則是對實現抽象化的具體步驟的規範。

下面舉例說明什麽是裏代換原則

實例1 正方形不是長方形

在幾何當中,正方形肯定是長方形,只不過它是特殊的長方形,四條邊都相等,利用面向對象的繼承關系,我們讓正方形繼承長方形,代碼如下:

// C#講解裏氏代換原則

// 實例名稱:正方形不是長方形

using System;

// 長方形類

class Rectangle

{

int length;

int width;

public int getLength()

{

return length;

}

public int getWidth()

{

return width;

}

public virtual void setLength(int length)

{

this.length = length;

}

public virtual void setWidth(int width)

{

this.width = width;

}

}

// 正方形類Square

class Square : Rectangle

{

public override void setLength(int length)

{

base.setLength(length);

base.setWidth(length);

}

public override void setWidth(int width)

{

base.setLength(width);

base.setWidth(width);

}

}

/*

* 由於正方形的長度和寬度必須相等,所以在方法setLength和setWidth中,

* 對長度和寬度賦值相同。類TestRectangle是我們的軟件系統中的壹個組件,

* 它有壹個resize方法要用到基類Rectangle,resize方法的功能是模擬長方形寬度逐步增長的效果

*/

//測試類TestRectangle

class TestRectangle {

// 此方法改變長方形的寬,將寬設為比高大

static void resize(Rectangle objRect)

{

Console.WriteLine("設置寬度開始");

while(objRect.getWidth() <=

objRect.getLength() )

{

objRect.setWidth( objRect.getWidth () + 1 );

}

Console.WriteLine("設置寬度結束");

}

static void Main()

{

// 實例化壹個長方形

Rectangle r=new Rectangle();

// 設長為10

r.setLength(10);

// 設寬為1

r.setWidth(1);

Console.WriteLine("長方形");

Console.WriteLine("改變之前長為:"+r.getLength());

Console.WriteLine("改變之前寬為:"+r.getWidth());

// 調用方法改變長方形的寬

resize(r);

// 改變之後

Console.WriteLine("改變之後長為:"+r.getLength());

Console.WriteLine("改變之後寬為:"+r.getWidth());

Rectangle s=new Square();

s.setLength(10);

s.setWidth(1);

Console.WriteLine("正方形");

Console.WriteLine("改變之前長為:"+s.getLength());

Console.WriteLine("改變之前寬為:"+s.getWidth());

// 調用方法改變正方形的寬

resize(s);

Console.WriteLine("改變之後長為:"+s.getLength());

Console.WriteLine("改變之後寬為:"+s.getWidth());

}

}

我們運行壹下這段代碼就會發現,假如我們把壹個普通長方

形的實例作為參數傳入resize方法,就會看到長方形寬度逐漸增長的效果,當寬度大於長度,代碼就會停止,這種行為的結果符合我們的預期;假如我們利用

裏氏代換所說的,把子類的實例賦給父類,再把父類(正方形)的實例作為參數傳入resize方法後,就會看到正方形的寬度和長度都在不斷增長,代碼會壹直

運行下去,直至系統產生溢出錯誤。所以,普通的長方形是適合這段代碼的,正方形不適合。

我們得出結論:在resize方法中,Rectangle類型的參數是不能被Square類型的參數所代替,如果進行了替換就得不到預期結果。因

此,Square類和Rectangle類之間的繼承關系違反了裏氏代換原則,它們之間的繼承關系不成立,正方形不是長方形。

當運行程序的時候,長方形可以正常的改變長方形的寬度,而正方形不能改變寬度。裏氏代換原則說明了我們不能亂用繼承,這裏長方形的長和寬和正方形的長和寬

明顯有不同的特點,所以正方形繼承長方形是錯誤的,正確的寫法是我們可以把正方形和長方形抽象出來,再讓正方形和長方形繼承這個抽象類,從而這兩個類互不

影響,各實現各的功能。

參考:/jiaping0424/article/details/6683478

望采納, 謝謝.