用不同数量的参数覆盖继承的方法

Override inherited method with different amount of parameters

有两个任务要解决:

首先应该从 class GeoObjects 继承一个 class 矩形。 其次,class 正方形应继承自 class 矩形。

抽象 class GeoObjects 已给出。

abstract class GeoObjects{
    public abstract double Perimeter();
    public abstract double Surface();
    
    public static void main (String [] argv){
        double width = 4.0, height = 5.0, side= 3.0;
        GeoObject rectangle = new Rectangle (width, height);
        GeoObject square= new Square(side);
        
        System.out.println ("Perimeter = " + rectangle.Perimeter());
        System.out.println ("Surface= " + rectangle.Surface());
        System.out.println ("Perimeter= " + square.Perimeter());
        System.out.println ("Surface= " + square.Surface());
    }
}

class Rectangle extends GeoObjects{
    
    double width, height, side;
    
    Rectangle (double width, double height){
        this.width = width;
        this.height= height;
    }
    
    public double Perimeter (){
    return 2*(width+ height);
    }
    public double Surface(){
    return width* height;
    }
}

class Square extends Rectangle {

    double side;

    Square (double side){
        this.side= side;
    }
    public double Perimeter (){
        return 4*side;
    }
    public double Surface(){
        return side*side;
    }
}

我得到的编译器信息是 Square 构造函数与 Rectangle 构造函数的变量数量不同。

如何在不损害 Square 必须从矩形而不是 GeoObjects 继承的要求的情况下解决这个问题?

编译器错误消息通知您,您正在尝试调用 Rectangle 中的超类构造函数,但参数数量与构造函数所具有的参数数量不同。您没有在 Square 中显式调用超类构造函数,因此编译器在 Rectangle 中插入了对默认超类构造函数的调用——实际上是 super(); 作为 [=14= 中的第一行].

但是Rectangle中没有不带参数的构造函数;只有一个有 2 个参数。适当地调用它,将 side 传递给 super() 两次。

您还会注意到 PerimeterSurface 方法不再需要重写,因为它们现在将使用超类中的正确值。

此外,正常的 Java 方法命名约定会让您命名以小写字符开头的那些方法:perimetersurface.

要修复您的 Square class,您需要使用 super(side, side)Rectangle 调用构造函数。您将不再需要 Square 中的 side class 变量,它可以简化为:

正方形:

class Square extends Rectangle {

Square (double side){
    super(side,side);
 }
}

矩形:

class Rectangle extends GeoObjects{

double width, height;

Rectangle (double width, double height){
    this.width = width;
    this.height= height;
}

public double Perimeter (){
return 2*(width+ height);
}
public double Surface(){
return width* height;
}
}

如果要重载Rectangle中的方法或将实现特定功能的方法放置到square中,需要使用widthheight变量而不是side