2016-04-26 106 views
-2

我的示例程序如下;理解Liskov替代原則

public class Animal 
    { 
     public virtual string MakeSound() 
     { 
      return "General Sound"; 
     } 
    } 

    public class Dog : Animal 
    { 
     public override string MakeSound() 
     { 
      return "Bow..Bow.."; 
     } 
    } 
} 

     static void Main(string[] args) 
     { 
      Animal obj1 = new Animal(); 
      Console.WriteLine("General Animal's sound id " + obj1.MakeSound()); 

      Dog obj2 = new Dog(); 
      Console.WriteLine("Dog Animal's sound id " + obj2.MakeSound()); 

      //Violate LSP 
      Animal obj3 = new Dog(); 
      Console.WriteLine("Animal's sound id " + obj3.MakeSound()); 

      Console.ReadKey(); 
     } 

這裏作爲我的理解,當我們爲動物創建Dog實例(如obj3)時,我們違反了LSP。請確認我的理解。如果是的話,請告訴我如何在這種情況下實現更好的理解。我認爲我的編碼在概念上是正確的

+1

你爲什麼認爲這會打斷LSP? (它不......) – Amit

+0

你是否期望它在編譯時失敗或者你期待不同的輸出? –

回答

0

你不違反Liskov替代規則。

Liskov替換規則在簡單的英語 - >如果Base.Method留下任何不變量,那麼Derived.Method必須考慮這些不變量。

不變量是一個對象的狀態,它不因方法執行而改變。

例如:

public class MyInt{ 
    private int num1 = 5; 

    public void print(){ 
     Console.write(num1); 
    }  

    public void increment(){ 
    num1++; 
    } 

} 

這裏的print的變量是唯一num1,因爲它不會改變。 increment的不變量不是,因爲它會更改所有MyInt成員。

在您例如:

不變的是Animal.MakeSound有:無。
Dog.MakeSound具有的不變量:非。

Animal.MakeSound的不變量在Dog.MakeSound中,因此Liskov置換規則沒有被破壞。

+0

好,所以我加了一個叫woodenDog的類,它是由woiod製成的玩具狗。所以他不能發出聲音。在這裏,如果我創建從動物繼承的WoodenDog類,我是violatingLSP。正確? – Akhil

0

你的例子並沒有真正違反LSP。我認爲違反了一個更好的例子是像

public class Bird 
{  
    public virtual void Fly(int height); 
} 

public class Penguin : Bird 
{ 
    public virtual void Swim(int depth); 
} 

public static class BirdExtensions 
{ 
    public static void Fly(this Bird bird) 
    { 
    } 
} 

如果我通過企鵝的實例,以這種方法,我可能會引發運行時異常或東西,因爲我的企鵝不會飛:(

你看,我們對於該基類的假設(所有的鳥都會飛),但現在我們有不符合這一假設一個子類的實例(企鵝不能飛)。

此外,因爲Penguin是-Bird,它的方法爲Fly(height=10),所以我可以在技術上這樣做,

Bird b = new Penguin(); 
b.Fly(height=100); 
b.Swim(depth=20); 

違反企鵝的能力(他不能飛那麼高,他只能飛在0,也許...?)。

+1

這不是利斯科夫替代規則的例子。 –

+0

試圖給出一個淡化版本的圓橢圓問題:https://en.wikipedia.org/wiki/Circle-ellipse_problem – Roly