Я наткнулся на вопрос в ООП в 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()
методы для установки свойств различных фигур во время инициализации, но я хотел бы знать, существует ли другой способ и позволяет ли мне определять переменный список параметров.
Заранее спасибо.
Как указано в комментариях к вашему вопросу, есть несколько способов решить вашу проблему.
Свойства класса и конструктор
Это был бы самый простой подход на мой взгляд. Это легко и умно.
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 не получил атрибутов. Атрибуты являются защищенными свойствами самого класса. Вы устанавливаете эти свойства при вызове конструктора определенного класса.
Я думаю, как идея использовать __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'];
}
}
}