具有四边形基础的Square/Rectangle(具有约束不变量)之间的继承关注

Bra*_*ith 7 java inheritance

我有一个界面Polygon,然后我有一个类Quadrilateral.然后,我有两个类,Square和Rectangle,它们扩展了Quadrilateral.

四边形由实例变量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, 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这被认为是不好的做法吗?这是为了大学任务,她没有说明她在寻找什么.如果我不在Square中使用Quadrilateral中的任何东西,那么扩展Quadrilateral类似乎没用.

Dav*_*fer 5

这取决于您希望"继承"关系在此处表示的内容.通常,人们想要表达的最好不要使用所谓的"面向对象的继承"来表达(实际上,我发现这种继承的用途很少).

在这种情况下,继承关系似乎表明子类相对于超类具有"附加约束"的事实.如果Polygon本身就是一个类而不是一个接口:

  • 多边形(任何东西,只要它是凸的)
  • 四边形(仅有4条边的附加约束)
  • 矩形(具有Pi/2角度的附加约束)
  • 方形(具有相同边长的附加约束)

基本上,我会:

要么只是编程Quadrilateral,删除setter并使所有实例变量最终.Square如果有人单独更换侧面,这可以摆脱一种现象,即你可以获得不受控制的变化.(一般来说,总决赛是一个好主意).然后子类减少到只有特殊的构造函数.

或者程序出了Quadrilateral唯一的,不继承,给它布尔检查:isRectangle(),isSquare(),也许离开的制定者.但这听起来不那么优雅.

同时推荐Bertrand Meyer的"遗产的多面性:分类学的分类"(1996),如果你能找到它,那就是支付费用,但附近可能有人使用IEEE Xplore访问.