2016-04-26 10 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(); 
     } 

私がobj3のようなAnimalのためのDogインスタンスを作成するときの私の理解として、私たちはLSPに違反しています。私の理解を確認してください。はいの場合は、この場合に達成する方法を教えてください。私は自分のコーディングが概念的に正しいと思う。

+1

なぜあなたはそれがLSPを破ると思いますか? (それは...) – Amit

+0

コンパイル時に失敗するか、別の出力を期待していますか? –

答えて

0

あなたはリスコフ選挙規則に違反していない。

簡単な英語のリスコフ選挙ルール - >Base.Methodが不変条件を残した場合、Derived.Methodはこれらの不変条件を指導しなければなりません。

不変量は、メソッドの実行結果として変更されないオブジェクトの状態です。例えば

:それは変更されませんので、ここで

public class MyInt{ 
    private int num1 = 5; 

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

    public void increment(){ 
    num1++; 
    } 

} 

は、printの不変量は、唯一のnum1です。 の不変量は、MyIntのすべてのメンバーを変更するため、不変ではありません。あなたの例では

Animal.MakeSoundが持つ不変:非。
不変量はDog.MakeSoundです。

Animal.MakeSoundの不変量はDog.MakeSoundに記載されているので、Liskovの置換規則は壊れていません。

+0

オクラホマから作られたおもちゃの犬であるwoodenDogというクラスをもう1つ追加しています。だから彼は音を出すことはできません。ここで私がAnimalから継承するWoodenDogクラスを作成すると、私は違反です。正しい? – 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

これはliskovのサブルールの例ではありません。 –

+0

円 - 楕円問題の波及したバージョンを提供しようとしています:https://en.wikipedia.org/wiki/Circle-ellipse_problem – Roly