1
我有一個抽象類,它定義了三種方法:act
,calculateStat
和calculateRelationship
。在act
方法中,我撥打電話calculateStat
和calculateRelationship
。如何在父類中的方法中調用覆蓋函數
理想情況下,我想是可以的,子類中,重寫這些方法,並讓他們在父母的act
方法中的act
方法被調用,但實現我試圖做到這一點不似乎工作;它只會使用父母的calculateStat
和calculateRelationship
方法。
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;
}
}
您是否知道'private'是什麼意思?您可能想使用'protected'代替 – Federkun