我很难理解前提条件和后置条件必须如何运作,而不违反替代原则。那么我们假设我们有一个班级Rectangle
和Square
- 如何联系他们?哪一个必须是子类?
所以我认为Subtype
的前提条件可能较弱,这意味着我们可以在子类中取出一大部分“一组”,另一方面后置条件可以更强所以我们可以返回一小部分“东西”。我怎样才能在我的例子中说明这些规则?
我读到基类必须“做”少于子类,所以我认为Square
必须是我们的基类,Rectangle
是子类。因此,Square
中的前提条件必须断言height == width
,但Rectangle
中的后置条件和前置条件怎么样?
答案 0 :(得分:1)
找出超级和子类的一般方法,你基本上需要回答这个问题:
每个X都是Y?
在你的情况下,你需要说出这两件事:
Rectangle
是Square
吗? 否强> Square
是Rectangle
吗? 是强> 因此Square
是Rectangle
。然后成为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替换原则 - 说明你期望某个类的任何地方(在我们的例子中Rectangle
) ,你应该能够使用该类的子类型(在我们的例子中Square
),而不会破坏功能或逻辑。如果你不这样做,那么这个设计违反了Liskov Subtitution Principle。
我可举个例子,但它是already written in this answer。请注意,此答案使用您提到的类。
因此,总而言之,正方形是一个矩形的特殊类型听起来合乎逻辑,但根据Liskov替换原则,这是一个糟糕的抽象。
是的,将Square
声明为Rectangle
的子类失败 Liskov替换原则。
请注意,他们还撰写了a Wikipedia page。这是一个非常常见的问题。
答案 4 :(得分:0)