1

Professeur に渡される親のメソッド getHC() が、子の $this->quota ではなく、親 (Enseignant) の $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;
        }
}

そして、アンセニアンの割り当てではなく、プロフェッサーの割り当てを使用してください。

4

1 に答える 1

3

サンプル コードには次の 2 つの問題があります。

  1. あなたのProfesseurクラスはクラスを拡張しませんEnseignant。これがサンプル コードにコピーした単なるタイプミスかどうかはわかりませんが、2 番目のクラスは次のように宣言する必要があります。

    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 に答える