多态真的有用吗?使用在哪些场景?

多态是面向对象编程(OOP)中的一个重要概念,它能够增加代码的灵活性和可维护性。多态的主要思想是同一个方法名在不同的类中有不同的实现,或者说同一个接口可以有多个不同的实现方式。让我们通过一个生动的例子来说明多态的用途。

假设有一个图形类,其中包括圆形和矩形两个子类。每个图形都有一个计算面积的方法,但是计算面积的方式在圆形和矩形之间是不同的。

class Shape {
    // 通用代码
}

class Circle extends Shape {
    private $radius;

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

    public function calculateArea() {
        return pi() * $this->radius * $this->radius;
    }
}

class Rectangle extends Shape {
    private $width;
    private $height;

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

    public function calculateArea() {
        return $this->width * $this->height;
    }
}

现在,如果我们要计算一组图形的总面积,可以使用多态。我们可以定义一个通用的函数,该函数接受一个​​Shape​​对象数组,并计算它们的总面积。

function calculateTotalArea(array $shapes) {
    $totalArea = 0;

    foreach ($shapes as $shape) {
        $totalArea += $shape->calculateArea();
    }

    return $totalArea;
}

现在我们可以创建圆形和矩形对象,将它们放入数组中,然后使用​​calculateTotalArea​​函数计算它们的总面积,而无需关心具体是哪种图形。

$circle = new Circle(5);
$rectangle = new Rectangle(4, 6);

$totalArea = calculateTotalArea([$circle, $rectangle]);

echo "总面积是:" . $totalArea;

这里,​​calculateTotalArea​​函数是多态的体现。它能够接受不同类型的图形对象,而无需知道具体对象的类型。这使得代码更加灵活,当你需要添加新的图形类型时,无需修改已有的计算总面积的函数,只需创建新的图形类并实现​​calculateArea​​方法即可。

这种使用多态的方式让代码更具扩展性和可维护性,因为它将通用的操作和特定的实现解耦,使得系统更容易适应变化。