1. (リスコフの置換原則に違反する反例) ここで、Subtraction クラスを担当する 2 つの数値を減算する関数を完了する必要があります。2 つの数値の加算を完了するには、新しい関数を追加する必要があります。 、そして 10 と合計します。クラス Add が担当するため、クラス Add はクラス S を継承します。

1. (リスコフの置換原則に違反する反例) ここで、Subtraction クラスを担当する 2 つの数値を減算する関数を完了する必要があります。2 つの数値の加算を完了するには、新しい関数を追加する必要があります。 、そして 10 と合計します。クラス Add が担当するため、クラス Add はクラス Subtraction を継承します。この例をデバッグして実行し、プログラムを実行すると間違った結果が得られる理由を分析します。

この例では、Add クラスは Subtraction クラスを継承しますが、その新しい関数 addAndSumTo10 は元の関数を拡張したりオーバーロードしたりせず、Subtraction クラスの関数を直接呼び出します。これにより、元のクラスのカプセル化と安定性が破壊されます。このような設計は、リスコフ置換原則に違反するだけでなく、プログラム内で誤った結果が生じる可能性があります。これは、addAndSumTo10 関数を呼び出すときに、実際には Subtraction クラスの減算関数が呼び出され、結果に 2 ではなく 10 が加算されるためです。数字を入力して10を足します。したがって、Add クラスを再設計するか、元の関数を直接呼び出すのではなく、新しい関数を独立した新しい関数として実装する必要があります。

2. 解析手順: 正方形や長方形はあまりありません。数学の分野では、正方形は間違いなく長方形、つまり長さと幅が等しい長方形です。そこで、弊社が開発した幾何図形関連のソフトウェアシステムでは、長方形を正方形に継承させることがスムーズです。ここで、分析のためにシステムのコード スニペットをインターセプトします: // Rectangle class Rectangle:class Rectangle { double length; double width; public double getLength() { return length; } public void setLength(double height) { this.length = length; } public double getWidth() { return width; } public void setWidth(double width) { this.width = width; } }//square class Square:class Square extends Rectangle { public void setWidth(double width) {
super.setLength(width); super.setWidth(width); } public void setLength(double length) { super.setLength(length); super.setWidth(length); メソッド setLength と setWidth では、同じ値を長さと幅。クラス TestRectangle は、ソフトウェア システムのコンポーネントです。このクラスには、基本クラス Rectangle を使用するサイズ変更メソッドがあります。サイズ変更メソッドの機能は、四角形の幅を徐々に増やす効果をシミュレートすることです。 //テスト クラス TestRectangle: class TestRectangle { public void sinner( Rectangle objRect) { while(objRect.getWidth() <= objRect.getLength()) { objRect.setWidth( objRect.getWidth () + 1 ); } }} プログラムの実行結果を解析する

プログラムの実行結果は、幅が長さよりも大きくなるまで、長方形の幅を徐々に増加させます。これは、サイズ変更メソッドでは、幅が長さよりも大きくなるまで、長方形の幅が毎回 1 ずつ増加するためです。正方形は長方形を継承しているため、正方形はサイズ変更メソッドを使用して幅の増加をシミュレートすることもできますが、正方形の幅と長さは等しいため、正方形の setWidth メソッドと setLength メソッドでは、setWidth メソッドと setLength メソッドのみが使用されます。基本クラス Rectangle の setLength メソッドを呼び出して、幅と長さを同じ値に設定する必要があります。

1. リスコフ置換原則に違反する反例:

class Subtraction { public intsubtract(int a, int b) { return a - b; } }



class Add extends Subtraction { public int addAndSumTo10(int a, int b) { return super.subtract(a, b) + 10; } }



この例では、Add クラスは Subtraction クラスを継承しますが、その新しい関数 addAndSumTo10 は元の関数を拡張したりオーバーロードしたりせず、Subtraction クラスを直接呼び出しているため、リスコフ置換原則に準拠していません。そして元のクラスの安定性。

2. 正方形と長方形がたくさんあります。

この例は「正方形は長方形である」という論理に従っているように見えますが、プログラムの実装に問題があります。長方形と正方形はサイズとプロパティが異なるため、コード内で正方形を長方形から継承すると、コードの保守と拡張が困難になります。この例では、正方形クラスを変更または拡張する場合、長方形の使用に影響を与え、不要なリスクが発生する可能性があります。したがって、より良いアプローチは、正方形と長方形を 2 つの独立したクラスとして扱い、それぞれが対応するプロパティとメソッドを実装し、継承によってもたらされる複雑さと不確実性を回避することです。

おすすめ

転載: blog.csdn.net/zezeaichirou/article/details/129549882