В чем косяк (полиморфизм)? Недавно ходил на собеседование и и меня попросили рассказать , что такое полиморфизм. Ответил следующие. class unit { public $hp = 'NaN'; public function setHp (){ return $this->hp = "30 hp"; } } class warrior extends unit { public function setHp (){ return $this->hp = "80 hp"; } } class medic extends unit { public function setHp (){ return $this->hp = "40 hp"; } } class tank extends unit { public function setHp (){ return $this->hp = "200 hp"; } } $warrior = new warrior; $medic = new medic; $tank = new tank; $unit = new unit; echo $warrior->setHp(); echo $medic->setHp(); echo $tank->setHp(); echo $unit->setHp(); Тот , кто мне собеседовал , сказал , что это не правильно . ( гуглил в инете везде подобных примеров полным полно). В чем я ошибаюсь ?
Ошибка заключается в том, что полиморфизм в объектно-ориентированном программировании означает возможность использования объектов разных классов через общий интерфейс. В данном примере классы warrior, medic и tank наследуются от базового класса unit, но переопределяют метод setHp(). Однако, для реализации полиморфизма, необходимо создать интерфейс или абстрактный класс, который определит метод setHp(), а затем каждый из дочерних классов будет реализовывать этот метод по-своему.
Правильный подход к реализации полиморфизма в данном случае может быть следующим:
interface UnitInterface { public function setHp(); } class unit implements UnitInterface { public $hp = 'NaN'; public function setHp (){ return $this->hp = "30 hp"; } } class warrior extends unit { public function setHp (){ return $this->hp = "80 hp"; } } class medic extends unit { public function setHp (){ return $this->hp = "40 hp"; } } class tank extends unit { public function setHp (){ return $this->hp = "200 hp"; } } $warrior = new warrior; $medic = new medic; $tank = new tank; $unit = new unit; echo $warrior->setHp(); echo $medic->setHp(); echo $tank->setHp(); echo $unit->setHp();
В этом коде создается интерфейс UnitInterface, который определяет метод setHp(). Затем классы unit, warrior, medic и tank реализуют этот интерфейс и переопределяют метод setHp() соответственно. Таким образом, обеспечивается правильная реализация полиморфизма.
Ошибка заключается в том, что полиморфизм в объектно-ориентированном программировании означает возможность использования объектов разных классов через общий интерфейс. В данном примере классы warrior, medic и tank наследуются от базового класса unit, но переопределяют метод setHp(). Однако, для реализации полиморфизма, необходимо создать интерфейс или абстрактный класс, который определит метод setHp(), а затем каждый из дочерних классов будет реализовывать этот метод по-своему.
Правильный подход к реализации полиморфизма в данном случае может быть следующим:
interface UnitInterface {public function setHp();
}
class unit implements UnitInterface {
public $hp = 'NaN';
public function setHp (){
return $this->hp = "30 hp";
}
}
class warrior extends unit {
public function setHp (){
return $this->hp = "80 hp";
}
}
class medic extends unit {
public function setHp (){
return $this->hp = "40 hp";
}
}
class tank extends unit {
public function setHp (){
return $this->hp = "200 hp";
}
}
$warrior = new warrior;
$medic = new medic;
$tank = new tank;
$unit = new unit;
echo $warrior->setHp();
echo $medic->setHp();
echo $tank->setHp();
echo $unit->setHp();
В этом коде создается интерфейс UnitInterface, который определяет метод setHp(). Затем классы unit, warrior, medic и tank реализуют этот интерфейс и переопределяют метод setHp() соответственно. Таким образом, обеспечивается правильная реализация полиморфизма.