リヒターの置換原則:
サブクラスは、親クラスを交換し、親が表示される可能性のある場所に表示されことができるはずです。例えば:それは新旧スタッフの従業員であるかどうかように、毎年恒例のパーティーに従事する会社、従業員は関係なく、本社の従業員や駐在員の、描くことができた、すべての抽選に参加することができるはずです。
リヒターは、それは、少なくとも2つの意味が含まれて置き換えます。
図1は、継承は、コードの再利用を達成することである場合Leebの原理を置換するサブクラスで再定義することができない場合、親クラスのメソッドのシェアは、同じままであるべきメソッドを共有するために、つまり、継承の目的のためです。サブクラスは親クラスとサブクラスをインスタンス化することができ、新しいメソッドを追加することで機能を拡張することができ、子クラスは親クラスとメソッドが同じで継承し、親はサブクラスは、同じ継承を呼び出すことができるメソッドを呼び出します来、論理的かつ一貫性のある方法の親クラスは、親クラスのオブジェクトオフ時に代わり、もちろん、ロジック・サブクラスのオブジェクト、問題はないと一致しています。
2. 継承された目的は、多形性であり、かつ多型前提はカバレッジのサブクラスであり、LSPを満たすために、親クラスのメソッドを再定義した場合、私たちは、親クラスは抽象クラスとして定義されていること、および抽象メソッドを定義しますが、サブクラスをさせてください親クラスが抽象的であるとき、これらのメソッドを再定義し、親クラスがインスタンス化されていない、それがプログラムでインスタンス化親クラスのオブジェクトに存在することはできません。親クラスのインスタンスのサブクラスを交換するときは(親クラスのインスタンスが存在しなかった)可能な論理矛盾が存在しません。
ケース:
1つの 内部 クラスプログラム 2 { 3 プライベート 静的 ボイドメイン(文字列[]引数) 4 { 5 A = 新しいA(); 6 Console.WriteLineを($ " 100-50 = {(a.func1(100、50))} " ); 7 8 BのB = 新しいB(); 9 Console.WriteLineを($ " 100-50 = {(b.func1(100、50))} " ); 10 Console.WriteLineを($ " 100-50 = {(b.func2(100、50))} "); 11 12 Console.ReadKey()。 13 } 14 } 15 16 内部 クラス17 { 18 公共のint関数func1(INT NUM1、INT NUM2) 19 { 20 リターン NUM1 - NUM2。 21 } 22 } 23 24 内部クラスB: 25 { 26 // 公共int型の関数func1(INT NUM1、INT NUM2) 27 // { 28 // NUM1 + NUM2を返します。 29 // } 30 31 公共 のint関数func2(INT NUM1、INT NUM2) 32 { 33 リターン関数func1(NUM1、NUM2)+ 100 。 34 } 35 }
それはコードで分かるように、クラスBが誤って派生クラスAは、スーパークラスのメソッドをオーバーライドfunc1の場合ならば、元の親クラスの機能を変更、予想一貫性のない結果につながります。出身地の変換原理は、次の要件を満たす必要があります。
1、サブクラス抽象親のメソッドを実装するクラスではなく、非抽象親クラスカバーすることができます
2、サブクラスは、独自のユニークな方法を追加することができます
親クラスのサブクラスは、親クラスメソッド緩いの方法よりもパラメータ入力パラメータをオーバーロード3、
図4に示すように、親クラスの抽象サブクラスの実装方法は、メソッドの戻り値は、親よりもより厳格でなければなりません
利点:
大幅バグの手続きを削減し、コードの可読性を高めることができます