【问题标题】:Class hierarchy of shapes形状的类层次结构
【发布时间】:2013-06-30 14:10:39
【问题描述】:

您好,我的 Java 练习中有这些类:RectangleEllipseSquareRectangle 的孩子还是我应该制作特殊的构造函数?

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

CircleEllipse (extends) 的子级吗?

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

【问题讨论】:

  • 应该是子接口。
  • 你的锻炼任务是什么?
  • 我不清楚,circle类在哪里??
  • 子接口是什么意思?

标签: java oop subclassing


【解决方案1】:

是的,将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
}

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

【讨论】:

  • 谢谢,这对我很有帮助。
  • @user2490538 很高兴我能帮上忙 :)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 两者都可以是抽象Shape类的子类,并且它们之间也可以分层连接。另外,我不同意冗余代码方面。虽然它确实更多地取决于 OP 试图做什么的上下文,但在创建应该易于使用和理解的公共 API 之类的东西时,拥有一个单独的 Circle 类可能是有意义的(不会有t 甚至需要是任何冗余代码,因为一切都将在Ellipse 中处理)。 Square 也是如此。
    • 也就是说,我将使用专门的构造函数来做什么,但我仍然认为,你有一个观点。更新了答案以反映这一点。
    【解决方案4】:

    从矩形导出正方形或从椭圆导出圆形都违反了 Liskov 替换原则。请参阅Is deriving square from rectangle a violation of Liskov's Substitution Principle? 进行演示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 2011-05-19
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多