Переопределить унаследованный метод с другим количеством параметров - PullRequest
0 голосов
/ 13 мая 2019

Необходимо решить две задачи:

Сначала прямоугольник класса должен быть унаследован от класса GeoObjects. Во-вторых, квадрат класса должен быть унаследован от прямоугольника класса.

Был задан абстрактный класс 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?

Ответы [ 2 ]

5 голосов
/ 13 мая 2019

Сообщение об ошибке компилятора информирует вас о том, что вы пытаетесь вызвать конструктор суперкласса в Rectangle с другим числом параметров, чем у конструктора. Вы явно не вызываете конструктор суперкласса в Square, поэтому компилятор вставил вызов конструктору суперкласса по умолчанию в Rectangle - фактически super(); в качестве первой строки в Square().

Но в Rectangle нет конструктора без параметров; есть только один с двумя параметрами. Назовите его соответствующим образом, передав side к super() дважды.

Вы также заметите, что методы Perimeter и Surface больше не нужно переопределять, поскольку теперь они будут использовать правильные значения из суперкласса.

Кроме того, в обычных соглашениях об именах методов Java вы должны указывать имена этих методов, начинающиеся со строчной буквы: perimeter и surface.

1 голос
/ 13 мая 2019

Чтобы исправить класс Square, вам нужно будет использовать super(side, side) для вызова конструктора из Rectangle.Вам больше не понадобится переменная класса стороны внутри Square, ее можно упростить до следующего вида:

Square:

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 или поместить методы, которые реализуют определенные функции, в квадрат, вам нужно использовать переменные width и height вместо side.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...