oop — абстрактный метод с переменным списком аргументов в переполнении стека

Я наткнулся на вопрос в ООП в PHP. Я попытался реализовать метод абстрактного родительского класса, и из дочернего класса я должен использовать его с переменным числом аргументов.

Вот ошибочная ошибка:

Неустранимая ошибка PHP: объявление Square :: getArea ($ length) должно быть совместимо с Shape :: getArea ()

И классы:

abstract class Shape {
abstract protected function getArea();
}

class Square extends Shape {

public function getArea($length)
{
return pow($length, 2);
}

}

class Triangle extends Shape {

public function getArea($base, $height)
{
return .5 * $base * $height;
}

}

Я мог бы использовать ребенка __construct() методы для установки свойств различных фигур во время инициализации, но я хотел бы знать, существует ли другой способ и позволяет ли мне определять переменный список параметров.

Заранее спасибо.

1

Решение

Как указано в комментариях к вашему вопросу, есть несколько способов решить вашу проблему.

Свойства класса и конструктор
Это был бы самый простой подход на мой взгляд. Это легко и умно.

interface Shape
{
protected function getShape();
}

class Square implements Shape
{
protected $length;

public function __construct(int $length)
{
$this->length = $length;
}

protected function shape()
{
return pow($this->length, 2);
}
}

class Triangle implements Shape
{
protected $base;

protected $height;

public function __construct(int $base, int $height)
{
$this->base = $base;
$this->height = $height;
}

protected function getShape()
{
return .5 * $this->base * $this->height;
}
}

Каждый класс реализует интерфейс Shape. Метод getShape не получил атрибутов. Атрибуты являются защищенными свойствами самого класса. Вы устанавливаете эти свойства при вызове конструктора определенного класса.

1

Другие решения

Я думаю, как идея использовать __construct это лучший подход на самом деле. Это то, для чего это. Вы хотите, чтобы каждая фигура была разной, и каждая фигура должна рассчитывать площадь по-разному. Отсюда и полиморфизм и принципы ООП проектирования.

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

abstract class Shape {
abstract protected function getArea($data = null); //Default to null incase it is not passed.
}

class Square extends Shape {

public function getArea($data) //$data should have a length key
{
if(isset($data)){
return pow($data['length'], 2);
}
}

}

class Triangle extends Shape {

public function getArea($data) //$data should have a base and height key
{
if(isset($data)){
return .5 * $data['base'] * $data['height'];
}
}

}
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector