Перегруженные статические методы, которые вычисляют площадь различных фигур, предупреждение о дублировании метода - PullRequest
0 голосов
/ 27 марта 2019

Я читаю Начиная с Java , и задача, представленная в книге, состоит в следующем: «Напишите класс, который имеет три перегруженных статических метода для вычисления областей следующих геометрических фигур: окружности, прямоугольники и цилиндры «. Для области круга требуется только один параметр, и здесь не было никаких проблем, поэтому я не использовал этот метод. Но площадь прямоугольника и площадь цилиндра требуют двух параметров:

public class Area{
    public static double area(double w, double l)
    {
      //Area of rectangle
        return l*w;
    }
    public static double area(double r, double h)
    {
      //Area of a cylinder
        return Math.PI * (r*r) *h;
    }
}

С помощью приведенного выше кода я получаю предупреждение "duplicate method area(double, double) in type Area." Я знаю, что если я просто изменю тип одного из параметров, у меня не возникнет этой проблемы, но это единственный способ, которым это может быть сделано? Я могу у вас нет двух перегруженных статических методов с одинаковым списком параметров?

Ответы [ 4 ]

3 голосов
/ 27 марта 2019

Оба эти метода:

  • называются 'area'
  • и принимают два аргумента типа 'double'

, поэтому они неразличимы.Имена, которые вы выбираете для формальных аргументов, не учитываются при принятии решения, потому что (после тривиального «потому что так работает язык») эти имена не записываются в исходном коде в тот момент, когда происходит вызов метода area ().made.

Учитывая постановку задачи, у вас мало выбора, кроме как изменить тип хотя бы одного из аргументов на одну из двух перегрузок.Разрешены ли целочисленные размеры?Float / double заставляет меня немного нервничать: слишком легко ошибиться.


Я понимаю, что это упражнение по перегрузке методов в Java, поэтому вы должны следовать постановке задачи.

Однако, как общая проблема: учитывая класс с именем Area с набором статических калькуляторов площади, IMO действительно было бы более понятно назвать каждый такой метод вычисления площади, чтобы сказать, что он действительно делает.Так например areaOfCircle и areaOfRectangle.Выполнение различных вычислений в зависимости от типов аргументов, на первый взгляд, не совсем понятно, какими будут хорошие имена.

1 голос
/ 27 марта 2019

Площадь круга может быть изменена на радиус в виде двойного числа, а число пи в виде числа с плавающей точкой. Таким образом, компилятор распознает разницу в методе круга. Идея урока заключается в том, что до тех пор, пока вы изменяете параметры в своих методах, у вас может быть несколько методов с одним и тем же именем, что является точкой перегрузки метода.

0 голосов
/ 28 марта 2019

Вот надуманный ответ, который удовлетворяет требованиям для трех перегруженных методов 'area' без необходимости использовать float или int там, где мы могли бы предпочесть double.

Первый класс Area. Для каждой фигуры нам нужны 3 вещи: (внутренний) класс, который содержит значения, которые определяют фигуру; функция, которая доставляет объект этого класса; и (что крайне важно) метод area (), который принимает один аргумент, объект внутреннего класса. Именно этот последний элемент удовлетворяет требованию «перегруженного метода».

class Area {

    static class Circle {
        double radius;
        Circle(double r) { radius = r; }
    }

    static Circle circle(double r) { 
        return new Circle(r);
    }

    static double area(Circle c) {
        return PI * c.radius * c.radius;
    }

    static class Rectangle {
        double length, width;
        Rectangle(double l, double w) { length = l; width = w; }
    }

    static Rectangle rectangle(double l, double w) {
        return new Rectangle(l, w);
    }

    static double area(Rectangle r) {
        return r.length * r.width;
    }

    static class Cylinder {
        double radius, height;
        Cylinder(double r, double h) { radius = r; height = h }
    }

    static Cylinder cylinder(douvle r, double h) {
        return new Cylinder(r, h);
    }

    static double area(Cylinder c) {
        return 2 * PI * c.radius * c.height + // side
               PI * c.radius * c.radius * 2;  // ends
               // see note!
    }
]

Теперь, как их использовать? Эти примеры показывают, как:

a1 = Area.area(Area.circle(1));
a2 = Area.area(Area.rectangle(2,3));
a3 = Area.area(Area.cylinder(4,5));

Существуют такие функции, как "Circle circle (...) {...}", поэтому мне не нужно писать "new" для создания Circle и т. Д.

Довольно некрасиво, да?

Примечание: ваша формула для «площади» цилиндра фактически вычисляет объем. Что именно вы подразумеваете под трехмерным телом? Если вы имеете в виду площадь поверхности, то это две конечные окружности плюс обернутый прямоугольник, который делает «сторону». У каждого из первых есть область 'pi r ^ 2'; прямоугольник имеет стороны '2 pi r' и 'h', таким образом, область '2 pi r h'.

0 голосов
/ 27 марта 2019

Вы можете сделать что-то вроде этого:

public class Area {

    // Rectangle
    public static double calculateArea(int width, int length) {
        return width * length;
    }

    // Cylinder
    public static double calculateArea(double radius, int height) {
        return Math.PI * Math.pow(radius, 2) * height;
    }

    // Circle
    public static double calculateArea(double radius) {
        return Math.PI * Math.pow(radius, 2);
    }
}

А затем позвоните, используя:

Area.calculateArea(2.0); // Call 'Circle' method
Area.calculateArea(2.0, 3); // Call 'Cylinder' method
Area.calculateArea(3, 5); // Call 'Rectangle' method
...