共享四边形基底的正方形/矩形(具有约束不变量)之间的继承问题



我有一个界面多边形,然后我有一个类Quadrilateral。然后,我有两个类,Square和Rectangle,它们扩展了四边形。

Quadrilateral由实例变量sideA, sideB, sideC和sideD组成。它包含area()和perimeter()方法来计算任何四边形的面积和周长。

考虑到这一点,类Square有一个实例变量lengthOfSides,类Rectangle有两个实例变量length和width。

由于Quadrilateral的area和perimeter方法可以用于计算任何四边形的面积和周长,包括正方形和矩形,我认为最好只是构造一个square或rectangle,然后调用超类来分配边(在Quadrilateral中需要进行面积和周长计算)。此外,当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中不使用Quadrilateral中的任何内容,那么扩展类Quadrilateral似乎是无用的。

这取决于您希望这里的"继承"关系表示什么。通常,想要表达的东西最好不要使用所谓的"面向对象继承"来表达(实际上,我发现这种继承的用途很少)。

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

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

基本上,我会:

要么只编程出Quadrilateral,删除setter并使所有实例变量为final。这就消除了如果有人单独改变两边,Square就会发生不受控制的变化的现象。(通常期末考试是一个好主意)。然后子类减少到只有特殊的构造函数。

或者只编程出Quadrilateral,不子类化,给它布尔检查:isRectangle(), isSquare(),可能留下setter。但这听起来没那么优雅。

同时推荐Bertrand Meyer的《继承的许多面:分类法的分类法》(1996),如果你能找到的话,它是付费的,但附近可能有人有IEEE Xplore访问权限。

最新更新