Blog

El polimorfismo – php
octubre 30, 2012 | en OOP, Php

El polimorfismo – php

El polimorfismo permite a un mismo nombre de método representar código diferente, en consecuencia puede expresar muchos comportamientos distintos.

Por ejemplo, supongamos que un usuario puede elegir entre tener un perro o un leon; y también puede hacer correr al animal que eligió haciendole gastar al animal una cantidad determinada de energía que varía segun el animal elegido

Primero veamos este código, luego lo analizamos.

<?php

// creamos la clase abstracta
abstract class AnimalAbstract
{
protected $_energiaConsumida = 0;

  public function getEnergiaConsumida()
  {
    return $this->_energiaConsumida;
  }
}

// creamos la clase perro que hereda la clase animal
class Perro extends AnimalAbstract
{
  public function correr()
  {
     $this->_energiaConsumida += 50;
  }
}

// creamos la clase leon que hereda la clase animal
class Leon extends AnimalAbstract
{
  public function correr()
  {
    if ($this->_energiaConsumida > 160){
        $this->_energiaConsumida += 100 ;
    } else {
        $this->_energiaConsumida += 80 ;
    }
  }
}

// Ahora creamos la clase usuario
class Usuario
{
private $_animal;

 function __construct($animal)
 {
   $this->_animal = $animal;
 }
 public function hacerCorrerAnimal()
 {
    $this->_animal->correr();
 }
 public function energiaConsumidaAnimal()
 {
    return $this->_animal->getEnergiaConsumida();
 }

}

$usuario_1 = new Usuario(new Perro);
$usuario_1->hacerCorrerAnimal();

$usuario_2 = new Usuario(new Leon);
$usuario_2->hacerCorrerAnimal();

echo 'Energía consumida por el animal del usuario 1 es: ' . $usuario_1->energiaConsumidaAnimal() . '<br>';
echo 'Energía consumida por el animal del usuario 2 es: ' . $usuario_2->energiaConsumidaAnimal() . '<br>';
/*
La salida sería:
Energía consumida por el animal del usuario 1 es: 50
Energía consumida por el animal del usuario 2 es: 80
*/
?>

Primero creamos la clase abstracta “Animal” con el método getEnergiaConsumida el cual devuelve la energía consumida de un animal. Cada clase de un animal debe heredar esta clase abstracta (ver Cuando utilizar la herencia) , en este caso hemos creado la clase Leon y la clase Perro.

Tanto la clase “Leon” y “Perro” tienen el método “correr”, el cual calcula la energía consumida de cada animal luego de “correr”, y en cada animal es diferente la forma de calcularla.

Luego creamos la clase “Usuario” en la que debemos especificar un animal cada vez que se instancia la clase, el cual va a ser el animal elegido por el usuario.

La clase “Usuario” tiene un método “hacerCorrerAnimal” que llama al método “correr” del animal elegido. A esto se le llama polimorfismo ya que definimos clases diferentes (en este caso Leon y Perro) que tienen métodos denominados de forma idéntica (en este caso “correr”), pero que se comportan de manera distinta.
Esto es realmente muy útil ya que la clase “Usuario” no sabe como calcular la energía consumida de cada animal luego de “correr”, eso es responsabilidad de cada animal, la clase “Usuario” solo llama al método correr del “Animal”.
Lo realmente importante es que cada clase de “Animal” tenga implementado el método “correr”, y para asegurarse de eso se utilizan las interfaces, tema que lo veremos en otro artículo.

comments powered by Disqus