Java:弱前置条件和强大的后置条件,如何?

时间:2015-10-27 11:05:26

标签: java preconditions post-conditions

我很难理解前提条件和后置条件必须如何运作,而不违反替代原则。那么我们假设我们有一个班级RectangleSquare - 如何联系他们?哪一个必须是子类?

所以我认为Subtype的前提条件可能较弱,这意味着我们可以在子类中取出一大部分“一组”,另一方面后置条件可以更强所以我们可以返回一小部分“东西”。我怎样才能在我的例子中说明这些规则?

我读到基类必须“做”少于子类,所以我认为Square必须是我们的基类,Rectangle是子类。因此,Square中的前提条件必须断言height == width,但Rectangle中的后置条件和前置条件怎么样?

5 个答案:

答案 0 :(得分:1)

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

  

每个X都是Y?

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

  • 每个RectangleSquare吗?
  • 每个SquareRectangle吗?

因此SquareRectangle。然后成为Square的条件是:

  • 如果它是一个矩形;
  • 高度等于宽度。

答案 1 :(得分:0)

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

你需要矩形的条件是它有4个尺寸不小于不多,任何三个角度都是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);
    }
}

答案 2 :(得分:0)

实际上它是另一回事。 Square是Rectangle的SubClass。为什么?每个Square'都是'Rectangle,但不是每个Rectangle'都是'Square。

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

矩形的约束是什么?每个角落都有一个矩形的格子(90°),Square的约束是什么?它是一个矩形(90°),每个边都有相同的长度。

答案 3 :(得分:0)

分型

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

Java使用关键字extends,因为子类实际上扩展超类,通常会添加功能。

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

Liskov替代原则

然而,替代原则 - 我猜你的意思是Liskov替换原则 - 说明你期望某个类的任何地方(在我们的例子中Rectangle) ,你应该能够使用该类的子类型(在我们的例子中Square),而不会破坏功能或逻辑。如果你不这样做,那么这个设计违反了Liskov Subtitution Principle。

我可举个例子,但它是already written in this answer。请注意,此答案使用您提到的类。

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

是的,将Square声明为Rectangle 的子类失败 Liskov替换原则。

请注意,他们还撰写了a Wikipedia page。这是一个非常常见的问题。

答案 4 :(得分:0)

  • Rectangle 是 Square 的子类。原因是,矩形更弱 正方形的形式:它的先决条件较弱。
  • 平方先决条件: 四个边,所有边都成 90 度相邻,所有边都相等。
  • 矩形 只有前两个先决条件。这两个行为是否相同 客户端代码?是的。
  • 平方:getArea() {return side*side}
  • 矩形:
    • getArea() {return l * w} << same interface Square 构造函数:
  • Square(int side) 矩形构造函数 1:
  • 矩形(int side){l = side; w = side;} << 与 square 相同的界面
  • 矩形构造函数2:
    • 矩形(int l, int w){this.l = s; this.w = w} << 新增
  • 为什么矩形允许有一个额外的 构造函数?因为它扩展了正方形,因此可以添加 功能,但不能限制超类的功能。