3

置換原則に違反することなく、事前条件と事後条件がどのように機能する必要があるかを理解するのに非常に苦労しています。では、クラスがRectangleあり、Squareそれらを関連付ける方法を考えてみましょう。サブクラスにする必要があるのはどれですか?

したがって、a の事前条件はSubtypeより弱くなる可能性があることを理解しています。つまり、アウト サブクラスで主要な「セット」を取得できます。一方、事後条件はより強力になる可能性があるため、マイナーな「セット」を返すことができます。物事の。これらのルールを私の例に適用するにはどうすればよいですか?

ベースクラスはサブクラスよりも「行う」必要があることを読んだので、それはSquare私たちのベースクラスとサブクラスでなければならないと思いますRectangle。したがって、 の事前条件はSquareassert thatheight == widthである必要がありますが、 の事後条件と事前条件はRectangleどうでしょうか?

4

5 に答える 5

0

実は逆なんです。Square は Rectangle のサブクラスです。なんで?すべての正方形は「長方形」ですが、すべての長方形が「正方形」であるとは限りません。

この継承関係をさらに拡張することができます。すべての GeometryShape はオブジェクトであり、すべての Polygon は GeometryShape であり、すべての Quadrangle は Polygon であり、すべての Rectangle は Quadrangle などです。サブクラスは親クラスよりも特別です。

Rectangle の制約とは何ですか? すべてのコーナーには長方形の角度 (90°) がありますが、正方形の制約は何ですか? すべての辺が同じ長さの長方形 (90°) です。

于 2015-10-27T11:13:59.257 に答える
0

サブタイプ

サブクラス (子クラス) は常に、基本クラス (スーパークラス) の特殊な型です。

extendsサブクラスは実際にスーパークラスを拡張し、多くの場合機能を追加するため、 Java はキーワードを使用します。

正方形は特別な、つまりより具体的なタイプの長方形です。これは長方形ですが、高さが幅に等しいという追加のプロパティがあります。


リスコフ置換原理

ただし、置換の原則 (Liskov Substitution Principle) を意味していると思いますが、特定のクラス (この場合Rectangle) を期待する場所であればどこでも、そのクラスのサブタイプを使用できる必要がある(この場合Square)と述べています。 、機能やロジックを壊すことなく。そうでない場合、設計は Liskov Subtitution Principle に違反しています。

例を挙げることはできますが、すでにこの回答に書かれています。この回答では、言及したクラスを使用していることに注意してください。

要約すると、正方形が特殊なタイプの長方形であることは論理的に聞こえますが、リスコフの置換原理によれば、それは悪い抽象化です。

そうです、Squareのサブクラスとして宣言することは、リスコフの置換原理にRectangle 失敗します。

彼らはそれについてウィキペディアのページも書いていることに注意してください。これは非常に一般的な問題です。

于 2015-10-28T00:29:51.037 に答える
0

すべての正方形は長方形ですが、すべての長方形は正方形ではないことを理解する必要があります。

長方形に必要な条件は、4 つのサイズがあり、3 つの角度が 90 度であることです。

コードでは、それらは 2 つの異なるクラスである必要があります。ポリゴン クラスを定義していませんが、その概念はわかります。

例:

public class Quadrilateral extends Polygon {
    ...
}

次 :

public class Rectangle extends Quadrilateral {
    private double length;
    private double breadth;

   public Rectangle (double len, double brd ) {...}

}

次に正方形:

public class Square extends Rectangle {
    private double side;
    public Square (double sideLength) {
         super(sideLength, sideLength);
    }
}
于 2015-10-27T11:09:52.793 に答える