我有一个界面Polygon,然后我有一个Quadranglateral类。然后,我有两个类,Square和Rectangle,它们扩展了Quadrilateral。
四边形由实例变量sideA,sideB,sideC和sideD组成。它包含方法area()和周长()来计算任何四边形的面积和周长。
考虑到这一点,类Square有一个实例变量lengthOfSides,而Rectangle类有两个实例变量,长度和宽度。
由于Quadrilateral中的方法区域和周长可用于计算任何四边形的面积和周长,包括正方形和矩形,我认为最好只构造一个Square或Rectangle,然后调用超类来分配边(四边形需要面积和周长计算)。此外,当更改Square或Rectangle中的实例变量时,setter还会更新父类中的关联值。
这是Square类:
/**
* A model for a Square.
*
* @author BTKS
*/
public class Square extends Quadrilateral {
private static final double ANGLES_SUM = 180; // the total sum of two opposite angles in degrees
private double lengthOfSides; // the length of each side
/**
* Construct a new Square.
*
* @param lengthOfSides the length of each side
*/
public Square(double lengthOfSides) {
super(ANGLES_SUM, lengthOfSides, lengthOfSides, lengthOfSides, lengthOfSides);
this.lengthOfSides = lengthOfSides;
}
/**
* @return the length of each side
*/
public double getLengthOfSides() {
return lengthOfSides;
}
/**
* @param lengthOfSides the length of each side
*/
public void setLengthOfSides(double lengthOfSides) {
this.lengthOfSides = lengthOfSides;
super.setSideA(lengthOfSides);
super.setSideB(lengthOfSides);
super.setSideC(lengthOfSides);
super.setSideD(lengthOfSides);
}
}
这被认为是不好的做法吗?这是为了大学任务,她没有说明她在寻找什么。如果我不在Square中使用四边形中的任何东西,那么扩展四边形类似乎没用。
答案 0 :(得分:5)
这取决于您希望“继承”关系在此处表示的内容。通常,人们想要表达的最好不要使用所谓的“面向对象的继承”来表达(实际上,我发现这种继承的用途很少)。
在这种情况下,继承关系似乎表示子类相对于超类具有“附加约束”的事实。如果Polygon本身就是一个类而不是一个接口:
基本上,我会:
要么只编出Quadrilateral
,删除setter并使所有实例变量最终。如果有人单独改变边,你可以摆脱Square
中不受控制的变化的现象。 (一般来说,总决赛是一个好主意)。然后子类减少到只有特殊的构造函数。
或者只编程Quadrilateral
,不要子类,给它布尔检查:isRectangle()
,isSquare()
,也许留下设置者。但这听起来不太优雅。
如果你能找到它,还推荐Bertrand Meyer的"The many faces of inheritance: a taxonomy of taxonomy"(1996),这是付费的,但附近可能有人使用IEEE Xplore访问。