用不同数量的参数覆盖继承的方法
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()
两次。
您还会注意到 Perimeter
和 Surface
方法不再需要重写,因为它们现在将使用超类中的正确值。
此外,正常的 Java 方法命名约定会让您命名以小写字符开头的那些方法:perimeter
和 surface
.
要修复您的 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中,需要使用width
和height
变量而不是side
有两个任务要解决:
首先应该从 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()
两次。
您还会注意到 Perimeter
和 Surface
方法不再需要重写,因为它们现在将使用超类中的正确值。
此外,正常的 Java 方法命名约定会让您命名以小写字符开头的那些方法:perimeter
和 surface
.
要修复您的 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中,需要使用width
和height
变量而不是side