我知道子类应该具有抽象父级的相同数据类型。但我没有宣布这样具体的事情。只是一个函数,子类确实声明了这个函数。所有其他子类都没有错误,但三角形没有错误。
abstract class Shape {
abstract function getArea();
}
class Square extends Shape {
protected $length = 4;
public function getArea () {
return pow($this->length, 2);
}
}
class Circle extends Shape {
protected $radius = 5;
public function getArea() {
return M_PI * pow($this->radius, 2);
}
}
class Triangle extends Shape {
protected $base = 3;
protected $height = 14;
public function getArea($base, $height) {
return .5 * $this->base * $this->height;
}
}
(new Triangle)->getArea();
为什么它会引发以下错误?
Triangle :: getArea()声明必须与Shape :: getArea()兼容。
答案 0 :(得分:0)
您收到错误,因为您的方法的足迹已更改。它们应该在构造函数中传递,而不是在方法中传递参数:
class Triangle extends Shape {
private $base;
private $height;
public function __construct($base, $height)
{
$this->base = (int) $base;
$this->height = (int) $height;
}
public function getArea($base, $height)
{
return 0.5 * $this->base * $this->height;
}
}
$foo = new Triangle(4, 13);
echo $foo->getArea();
我还强烈建议您改变其他类,以便$radius
和$length
等参数也在各自的构造函数中传递。否则,您目前正在打破开放式原则。