2016-12-15 66 views
1

我有一個抽象類,它定義了三種方法:act,calculateStatcalculateRelationship。在act方法中,我撥打電話calculateStatcalculateRelationship如何在父類中的方法中調用覆蓋函數

理想情況下,我想是可以的,子類中,重寫這些方法,並讓他們在父母的act方法中的act方法被調用,但實現我試圖做到這一點不似乎工作;它只會使用父母的calculateStatcalculateRelationship方法。

abstract class Action { 

    protected $name = 'Generic'; 
    protected $acts_on = Person::STAT_GENERIC; 
    protected $action_points = 1; 

    public function act($performer, $performee) { 
     // Get Perfomer and Performee stats 
     $performer_stat = $performer->getStat($this->acts_on); 
     $performee_stat = $performee->getStat($this->acts_on); 

     // Calculate values 
     $new_stat = $this->calculateStat($performer_stat, $performee_stat); 

     // Apply values 
     $performee->setStat($this->acts_on, $new_stat); 

     $stat_diff = $new_stat - $performee_stat; 
     $relationship = $performee->getRelationship($performer->getID()); 

     $new_relationship = $this->calculateRelationship($relationship, $stat_diff); 

     $performee->setRelationship($performer->getID(), $new_relationship); 

     // Output 
     Output::getInstance()->addOutput($performer->getName() . ' performed ' . $this->name . ' on ' . $performee->getName() . ' making their stat change from ' . $performee_stat . ' to ' . $new_stat); 
     Output::getInstance()->addOutput($performee->getName() . '\'s relationship with ' . $performer->getName() . ' changed from ' . $relationship . ' to ' . $new_relationship); 

    } 

    private function calculateStat($performer_stat, $performee_stat) { 
     $performer_multiplier = 2 * $performer_stat/Person::STAT_MAX; 
     $new_stat = $performee_stat + ($this->action_points * $performer_multiplier); 

     if ($new_stat > Person::STAT_MAX) { 
      $new_stat = Person::STAT_MAX; 
     } 

     return $new_stat; 
    } 

    private function calculateRelationship($relationship, $stat_diff) { 
     if ($stat_diff < 0) { 
      $relationship_multiplier = -1; 
     } else { 
      $relationship_multiplier = 1; 
     } 

     $new_relationship = $relationship_multiplier * ($relationship + ($stat_diff/2)); 

     return $new_relationship; 
    } 
} 

在一個子類,它不調用重寫的方法:

class ActionClub extends Action { 

    protected $name = 'Club'; 
    protected $acts_on = Person::STAT_GENERIC; 
    protected $action_points = -20; 


    private function calculateStat($performer_stat, $performee_stat) { 
     return 100; 
    } 
} 
+2

您是否知道'private'是什麼意思?您可能想使用'protected'代替 – Federkun

回答

0

我用的方法從private範圍更新爲protected固定這一點。