Вот надуманный ответ, который удовлетворяет требованиям для трех перегруженных методов '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'.