出現的地方,子類壹定可以出現。 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
望采納, 謝謝.