3

在不违反替代原则的情况下,我很难理解前置条件和后置条件必须如何工作。所以让我们假设我们有一个类Rectangle并且——Square如何关联它们?哪一个必须是子类?

所以我理解 a 的前置条件Subtype可以更弱,这意味着我们可以在子类中取一个主要的“集合”,另一方面,后置条件可以更强,所以我们可以返回一个次要的“集合” ' 东西的。如何在我的示例中应用这些规则?

我读到基类必须比子类“做”得少,所以我认为这Square必须是我们的基类和Rectangle子类。因此, in 的前置条件Square必须是 assert that height == width,但后置条件和 in 的前置条件Rectangle呢?

4

5 回答 5

2

找出超类和子类的一般方法,你基本上需要回答这个问题:

每个 X 都是 Y 吗?

在你的情况下,你需要说这两件事:

  • 是每Rectangle一个Square不。
  • 是每Square一个Rectangle是的。

因此Square是一个Rectangle。那么成为的条件Square是:

  • 如果是矩形;
  • 高度等于宽度。
于 2015-10-27T11:19:40.180 回答
0

其实是反过来的。Square 是 Rectangle 的子类。为什么?每个 Square 'is a' Rectangle,但不是每个 Rectangle 'is a' Square。

您可以进一步扩展这种继承关系,每个 GeometricShape 都是一个 Object,每个 Polygon 都是一个 GeometricShape,每个 Quadrangle 是一个 Polygon,每个 Rectangle 都是一个 Quadrangle,等等。继承层次越往下,添加的约束就越多,使得子类比父类更特殊。

什么是矩形的约束?每个角都有一个矩形角(90°),正方形的约束是什么?它是一个矩形(90°),每条边的长度相同。

于 2015-10-27T11:13:59.257 回答
0
  • 矩形是方形的子类。原因是,矩形是正方形的一种较弱的形式:它具有较弱的先决条件。
  • 正方形的前提条件:四个边,都90度相邻,所有边相等。
  • 矩形只有前两个前提条件。这两个对于客户端代码的行为是否相同?是的。
  • 正方形:getArea() {返回边*边}
  • 长方形:
    • getArea() {return l * w} << 同接口 Square 构造函数:
  • Square(int side) 矩形构造函数 1:
  • 矩形(int side){l = side; w = side;} << 与正方形界面相同
  • 矩形构造函数2:
    • 矩形(int l,int w){this.l = s; this.w = w} << 新增
  • 为什么矩形允许有一个额外的构造函数?因为它扩展了正方形,因此可以添加功能,但不能限制超类的功能。
于 2021-03-03T03:45:34.027 回答
0

您需要了解每个正方形都是矩形,但每个矩形都不是正方形。

矩形需要的条件是它的大小不少于不少,并且任何三个角度都是 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 回答
0

子类型化

子类或子类始终是基类或超类的特殊类型。

Java 使用关键字extends,因为子类实际上扩展了超类,经常增加功能。

正方形是一种特殊的,即更具体的矩形类型。它是一个矩形,但具有高度等于宽度的附加属性。


里氏替换原则

但是,替换原则——我猜你的意思是 Liskov 替换原则——指出在任何你期望某个类的地方(在我们的例子中Rectangle),你应该能够使用该类的子类型(在我们的例子中Square) ,而不会破坏功能或逻辑。如果不是,则该设计违反了 Liskov 替代原则。

我可以举一个例子,但它已经写在这个答案中。请注意,此答案使用您提到的类。

因此,总而言之,正方形是矩形的一种特殊类型听起来合乎逻辑,但根据 Liskov 替换原则,它是不好的抽象。

所以是的,声明Square为的子类Rectangle 符合 Liskov 替换原则。

请注意,他们还写了一个关于它的维基百科页面。这是一个非常普遍的问题。

于 2015-10-28T00:29:51.037 回答