0

您好,我的 Java 练习中有这些类:RectangleEllipse. 是Square孩子Rectangle还是我应该做特殊的构造函数?

// constructor for Square
public Rectangle(double side) {
    this.width = side;
    this.height = side;
}

是( )Circle的孩子吗?Ellipseextends

这可能是一个简单的应用程序,如 Kojo 或 Geogebra。

4

4 回答 4

2

Square是的,将 a视为Rectangle宽度和高度相等的子类似乎是合理的:

public Square(double side) {
    super(side, side);  // reference to Rectangle constructor
}

类似地,对于 也可以这样说Circle,它本质上是一个椭圆,其主要和次要半径都相等:

public Circle(double radius) {
    super(radius, radius);  // reference to Ellipse constructor
}

是否要创建具体的子类来表示这些形状取决于您,并且您应该在您的程序上下文中做任何更有意义的事情。

于 2013-06-30T14:16:19.557 回答
1

这里的问题是:你创建这个层次结构是为了使用还是仅仅为了设计?

如果您是为设计而做的,请创建一个扩展自其他的类,Rectangle否则只会使您的代码更复杂而没有任何真正的改进。您可以将其应用于圆/椭圆问题

于 2013-06-30T14:17:00.507 回答
1

既不也不!两者都应该是抽象形状的子类。您可能希望在此基类中进行一些坐标转换,以便子类可以简单地实现以原点为中心的圆或正方形。但是您不希望其中一个成为另一个的子类。

为什么?因为您必须为行为/界面设计,而不是为数据设计!根据我的经验,为数据设计几乎总是会导致复杂的设计。

而且,除非您有特定的理由来实际提供圆形/矩形类(请参阅下面的注释),否则为圆形添加一个额外的类似乎不是一个好主意,因为您已经有一个椭圆,这只是多余的代码. 我会使用专门的构造函数来构造更受约束的情况。

于 2013-06-30T14:20:05.177 回答
0

从矩形导出正方形或从椭圆导出圆形都违反了 Liskov 替换原则。请参阅从矩形导出正方形是否违反了 Liskov 的替换原则?为演示。

于 2018-09-26T13:53:08.013 回答