0

我已经阅读了几个关于 PHP 中抽象类的主题,但似乎没有一个答案能解决我的问题:为什么抽象类中的方法在不可能的情况下需要与子类具有相同的签名(相同的参数)知道这些抽象方法的子类实现可能需要什么?抽象类的经典示例类似于 GeometricShape() 类,其中两个子类可能是 Rectangle 类扩展 GeometricShape() 和 Circle 类扩展 GeometricShape()。一个的 getArea() 方法需要长度和宽度作为参数,另一个只需要半径。这应该如何在 PHP 中工作?

4

3 回答 3

2

length, width, 并且radius不应该是方法的参数,它们应该是类中的属性。当你想得到一个对象的面积时,你只需调用:

$area = $shape->getArea();

方法会Rectangle返回,方法也会返回。length*widthCirclepi*radius*radius

签名必须相同,因为此代码不知道它是否在操作Circleor Rectangle,它需要GeometricShape同等对待所有对象。

于 2013-09-06T04:17:48.363 回答
1

这是一个很好且有趣的问题。在像 GeometricShape() 这样的情况下,GetArea 将没有参数。一个更好的例子是一个名为 FillColor 的抽象方法,它将颜色作为参数,如下所示:

abstract class GeometricShape
{
    abstract function GetArea();
    abstract function FillColor($color);
}


class Square extends GeometricShape
{
    function GetArea()
    {
        echo "Square - get area\r\n";
    }

    function FillColor($color)
    {
        echo "Square - Filling color $color\r\n";
    }
}


class Circle extends GeometricShape
{
    function GetArea()
    {
        echo "Circle - get area\r\n";
    }

    function FillColor($color)
    {
        echo "Circle - Filling color $color\r\n";
    }
}   

$square = new Square();
$square->FillColor('green');
$circle = new Circle();
$circle->FillColor('red');

抽象类是为了给孩子们提供一个孩子们可以覆盖的共同个性。抽象类也可以提供儿童可以按原样使用的脚手架/基本属性。

如果抽象方法应该提供更宽松的签名,则可以将数组发送给它。这样,圆形可以使用包含半径的数组覆盖该方法,而矩形可以发送具有长度和宽度的数组。方法体将使用数组来确定已接收到什么以及如何处理它。

于 2013-09-06T04:17:05.323 回答
0

我认为您正在混合 OOP 的各种概念

抽象

当您的类必须为类及其子类提供概念限制时,抽象就会发挥作用。例如,从现实世界中举一个例子,Tree在它具体化为某物之前是概念性的,例如Apple Tree。如果您是博物学家,您希望保持自然的事物自然(不喜欢基因改造!),并确保Apple Tree确实产生苹果而不是芒果并且确实有roots。现在关注术语wrtroots和 wrt以及任何其他术语。当我们讨论这些关于它们是非常开放的终端接口时,每棵树都应该或必须被称为 a (除非或直到它的 GM )。接口中的接口是抽象接口bcz子类即fruitTreeApple TreeXyz TreeTreeTreerootsTreeApple Tree知道如何从地下吸取矿物质来制造apple fruit。所以每个工厂都采用不同的方法来实现roots接口。

方法覆盖(getArea() 方法)

在您的示例 getArea() 方法中,或多或少是方法覆盖的示例,其中孩子决定忽略/抑制其继承的行为/属性的某些部分。

我希望这个自然的例子不是那么复杂

于 2013-09-06T05:04:32.603 回答