你好我的Java练习中有这些类:Rectangle和Ellipse。是Square的Square子,还是应该创建特殊的构造函数?
// constructor for Square
public Rectangle(double side) {
this.width = side;
this.height = side;
}
Ellipse的Circle子(扩展)?
这可能是像Kojo或Geogebra这样的简单应用程序。
答案 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?。