В коде нет класса Square, а Triangle фактически хранит радиус и считает площадь круга. Перенесите вычисление площади в сами фигуры через общий интерфейс.
Поиск и исправление дефектов в расчёте площадей фигур
В коде нет класса Square, а Triangle фактически хранит радиус и считает площадь круга. Перенесите вычисление площади в сами фигуры через общий интерфейс.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В этом задании нужно внимательно проанализировать представленный фрагмент кода, обнаружить в нём логические и синтаксические погрешности и предложить варианты их устранения. Особое внимание следует обратить на отсутствие нужного класса, неверное использование переменных и некорректный возврат результата. Предложите более надёжную реализацию, учитывающую принципы ООП и полиморфизм.
class Shape
{
public $w;
public $h;
public function __construct($w, $h)
{
$this->w = $w;
$this->h = $h;
}
}
class Triangle
{
public $r;
public function __construct($r)
{
$this->r = $r;
}
}
class AreaCalculator
{
public
function calculate($figures)
{
$areas = [];
foreach ($figures as $figure) {
if (is_a($figure, 'Square')) {
$areas[] = $figure->w * $figure->h;
} else if (is_a($figure, 'Triangle')) {
$areas[] = $figure->r * $figure->r * pi();
}
}
return array_sum($areas);
}
}
Ответ
В коде нет класса Square, а Triangle фактически хранит радиус и считает площадь круга. Перенесите вычисление площади в сами фигуры через общий интерфейс.
interface Shape { public function area(): float; }
final class Rectangle implements Shape {
public function __construct(private float $w, private float $h) {
if ($w < 0 || $h < 0) throw new InvalidArgumentException();
}
public function area(): float { return $this->w * $this->h; }
}
final class Circle implements Shape {
public function __construct(private float $r) {
if ($r < 0) throw new InvalidArgumentException();
}
public function area(): float { return pi() * $this->r ** 2; }
}
function totalArea(Shape ...$figures): float {
return array_sum(array_map(fn(Shape $s) => $s->area(), $figures));
}
Если нужен именно треугольник, задайте основание и высоту, площадь — их произведение пополам. Перенос строки между public и function сам по себе синтаксической ошибкой не является.