1

为什么传递给Professeur的父方法getHC()是指父(Enseignant)的$this->quota,而不是子的$this->quota。

abstract class Enseignant {

  private $quota; //empty

  public function __construct($nom, $nbHeures)[...]

  public function getHC(){
     return $this->nbHeures - $this->quota; //Ici le problème
  }

  abstract protected function setQuota($q);
}

我需要 $this->nbHeures - $this->quota 传递给 Professeur

class Professeur extends Enseignant {
        const QUOTA = 192;

        public function __construct($nom, $nbHeures) {
            parent::__construct($nom, $nbHeures);
            $this->setQuota(self::QUOTA);
        }

        protected function setQuota($q) {
            $this->quota = $q;
        }
}

并且使用教授的配额而不是 Enseignant 的配额。

4

1 回答 1

3

我可以看到您的示例代码存在两个问题:

  1. 您的Professeur课程没有扩展Enseignant课程。我不确定这是否只是您在示例代码中复制的错字 - 但第二类应声明为:

    class Professeur extends Enseignant {
    
  2. $quota成员变量在父类中被声明为私有。这意味着子类无法访问该值,并且子类中的setQuota()函数改为在子类上设置一个具有相同名称的新(未声明)变量。

    要解决此问题,您应该将$quota变量声明为protected而不是private.

    protected $quota;
    

以下代码应该更像您所期望的那样工作:

abstract class Enseignant {
    protected $quota; // declare as protected so it can be
                      // accessed and modified from the child class

    public function __construct($nom, $nbHeures) {
        $this->nbHeures = $nbHeures;
    }

    public function getHC() {
        return $this->nbHeures - $this->quota;
    }

    abstract protected function setQuota($q);
}

class Professeur extends Enseignant {
    const QUOTA = 192;

    public function __construct($nom, $nbHeures) {
        parent::__construct($nom, $nbHeures);
        $this->setQuota(self::QUOTA);
    }

    protected function setQuota($q) {
        $this->quota = $q;
    }
}

$e = new Professeur("Charles", 292);
echo $e->getHC(); // returns 100 now

另一种解决方案是将$quota变量保留为私有,并使setQuota()方法成为父类的一部分 - 仍然从子构造函数中调用它。

于 2013-11-05T18:50:53.353 回答