四边形由实例变量sideA,sideB,sideC和sideD组成.它包含方法area()和周长()来计算任何四边形的面积和周长.
考虑到这一点,类Square有一个实例变量lengthOfSides,而Rectangle类有两个实例变量length和width.
由于四边形中的方法区域和周长可用于计算任何四边形的面积和周长,包括正方形和矩形,我认为最好只构造一个正方形或矩形,然后调用超类来指定边(四边形需要面积和周长计算).此外,当更改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); 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); } }
这被认为是不好的做法吗?这是为了大学任务,她没有具体说明她在寻找什么.如果我不在Quad中使用四边形中的任何东西,那么扩展四边形类似乎没用.
解决方法
在这种情况下,继承关系似乎表达了子类相对于超类具有“附加约束”的事实.如果Polygon本身就是一个类而不是一个接口:
>多边形(任何东西都可以,只要它是凸的)
>四边形(仅有4条边的附加约束)
>矩形(具有Pi / 2角度的附加约束)
>方形(具有相同边长的附加约束)
基本上,我会:
要么只编写Quadrilateral,删除setter并使所有实例变量最终.如果有人单独改变边,你可以摆脱在Square中无法控制的变化的现象. (一般来说,总决赛是一个好主意).然后子类减少到只有特殊的构造函数.
或者只编写Quadrilateral,不要子类,给它布尔检查:isRectangle(),isSquare(),也许留下setter.但这听起来不那么优雅.
如果你能找到它,还推荐Bertrand Meyer的“The many faces of inheritance: a taxonomy of taxonomy”(1996),这是有支付线的,但附近可能有人使用IEEE Xplore访问.