5

我正在尝试在 PHP 中学习 OOP,现在我已经达到了抽象类。

我在理解什么时候应该在抽象类中实现抽象方法以及什么时候不应该实现一些问题。

例如,有这个代码:

<?php

abstract class concept_car {
    /**
     * Properties can not be declared as abstract natively:
     * http://stackoverflow.com/questions/7634970/php-abstract-properties
     */
    protected $weelNum  = NULL;
    protected $doorsNum = NULL;
    protected $color    = NULL;
    protected $carType  = NULL;
    // the inheritance class must define this methods
    abstract public function setWeelNum($weelNum);

    abstract public function setDoorsNum($doorsNum);

    abstract public function setCarType($carType);
}

我不知道是否可以将这 3 个方法声明为抽象,或者我应该删除抽象并实现它们,因为属性与方法在同一个类中。

在代码的实际形式中,我在想我必须在这里将方法声明为抽象并在继承类中实现它们,在子类中,但我不知道这是否是正确的方法。

PS:我是一个初学者,我正在努力了解事情的进展,我还没有接触到设计模式,所以请用概念解释我,这样我才能知道正确的方法是什么。

4

2 回答 2

7

你必须问自己一个简单的问题:

扩展这个的所有类都做同样的事情吗?

对于这个例子,答案是肯定的,他们都会做

public function setWeelNum($weelNum) {
  $this->weelNum = $weelNum;
}

所以不要在每个类中复制/粘贴该代码,这没有意义。

什么时候应该声明一个抽象方法?

当该类的所有孩子都必须以不同的方式实现此方法时。

例如,在课堂Animal上,你会有一个public abstract function move();,因为所有的动物都在移动,但你不知道具体是如何移动的。

于 2013-06-04T12:53:11.920 回答
4

通常,您应该在最后一个共同祖先中实现所有方法。因此,如果您希望您的子类具有相同的行为方式,请立即实现它们。如果要实现它们,但在许多方面由不同的类实现,请将它们保留为抽象的。

实际上,抽象类只是为了要求如果有人从这个公共类继承某些东西,他将提供这些方法(抽象类类似于接口)。

如果您实现所有这些,则无需使用抽象类。

于 2013-06-04T12:49:29.823 回答