形状的类层次结构

时间:2013-06-30 14:10:40

标签: java oop

你好我的Java练习中有这些类:Rectangle和Ellipse。是Square的Square子,还是应该创建特殊的构造函数?

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

Ellipse的Circle子(扩展)?

这可能是像Kojo或Geogebra这样的简单应用程序。

4 个答案:

答案 0 :(得分:2)

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

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

同样,对于Circle也可以这么说,public Circle(double radius) { super(radius, radius); // reference to Ellipse constructor } 本质上是一个椭圆,主半径和次半径都是相等的:

{{1}}

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

答案 1 :(得分:1)

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

如果您正在为设计进行此操作,请创建一个从Rectangle扩展的类,否则只会使您的代码更复杂而不会有任何实际改进。您可以将相同的内容应用于圆/椭圆问题

答案 2 :(得分:1)

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

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

并且,除非你有特定的理由要实际提供圆/矩形类(参见下面的评论),如果已经有一个椭圆,那么为圆形设置一个额外的类似乎不是一个好主意。是冗余代码。我会使用专门的构造函数来构造更多约束的案例。

答案 3 :(得分:0)

从矩形派生正方形或从椭圆派生圆都违反了Liskov替换原理。有关演示,请参见Is deriving square from rectangle a violation of Liskov's Substitution Principle?

相关问题