3

私は SOLID 設計原則に非常に慣れていません。理解に問題があったことの1つは、リスコフ置換原理違反の「四角形」の例です。Square の Height/Width セッターが Rectangle のものをオーバーライドする必要があるのはなぜですか? ポリモーフィズムが存在する場合、これがまさに問題の原因ではありませんか?

これを削除しても問題は解決しませんか?

class Rectangle
{
    public /*virtual*/ double Height { get; set; }
    public /*virtual*/ double Width { get; set; }
    public double Area() { return Height * Width; }
}

class Square : Rectangle
{
    double _width; 
    double _height;
    public /*override*/ double Height
    {
        get
        {
            return _height;
        }
        set
        {
            _height = _width = value;
        }
    }
    public /*override*/ double Width
    {
        get
        {
            return _width;
        }
        set
        {
            _width = _height = value;
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        Rectangle r = new Square();
        r.Height = 5;
        r.Width = 6;

        Console.WriteLine(r.Area());
        Console.ReadLine();
    }
}

出力は予想どおり 30 です。

4

2 に答える 2

10

ユーザーが次のような GUI アプリケーションでバウンディング ボックスを実装しているとします。

ここに画像の説明を入力

この青いボックスをクラスで表現したいRectangleので、ユーザーがクリックして下にドラッグすると、その高さが増加します。ユーザーが右にドラッグすると、幅が広がります。

LSP は、Rectangle のビジネス ロジックを壊すことなく、スーパークラス (Rectangle) を使用する場所ならどこでも、クライアントが派生クラス (Square) を使用できる必要があると述べています。彼らのコードは壊れてはいけません。

ただし、以下は互いに互換性がありません。

  • セッターメソッドが副作用を引き起こさない(つまり、高さに影響を与えるべきではない)というのは、 Rectangleの想定事後条件です。setWidth
  • 幅が常に高さに等しいというのは、Square のロジックに固有のものです。

プログラマーが Rectangle の代わりに Square を使用した場合、ユーザーが下にドラッグしたかのように、ボックスが水平方向と垂直方向に同時に大きくなるため、上記の仮定は機能しません。


Square/Rectangle の例の問題点は、最初から Rectangle について想定しすぎていることです。長方形は高さとは異なる長さを持つことができますが、これは特定の種類の長方形 (長方形) のプロパティです。

正方形長方形ですが、正方形は長方形ではありません。クラスについて横長の動作を仮定したい場合(幅と高さが異なる可能性がある)、クラスがそれから拡張するRectangleことは意味がありません。Square

于 2013-08-15T21:45:00.287 に答える
1

LSP は、サブクラスのオブジェクトを置換しても、プログラムの動作や正確性が変わるべきではないと述べています。指定するクラスによって正確さが変わります。長方形の場合、クラスのクライアントは、高さと幅が個別に設定可能であることを期待します。Square でサブクラス化すると、これは当てはまりません。

幅 5 と高さ 10 を設定しているクライアントは、たまたま Square であるが Rectangle 変数に保持されているオブジェクトを参照しているときに、高さと幅のプロパティを設定した順序に従って異なる結果を取得します。5x5 の長方形または 10x10 の長方形が得られる可能性があります。いずれにしても想定外でしょう。

Barbara のオリジナルの LSP の複雑な説明がありますが、Uncle Bob の説明はそれをより簡単にします。これは、正方形/長方形の問題で壊れています。

これについてはhttp://www.blackwasp.co.uk/SquareRectangle.aspxで記事を書きました。

于 2013-08-15T22:12:38.557 に答える