Daniel Segovia

Blog personal

Archive for the ‘4.9 Polimorfismo’ Category

Polimorfismo

Hacer un comentario

Probablemente sea la característica más importante de la programación orientada a objetos.
Describiendo una situación de la vida real será mucho más fácil entenderlo.
Supongamos que una persona puede elegir entre 2 vehículos Fiat o Ferrari, ambos tienen la posibilidad de avanzar como característica común. Ahora sí bien la finalidad de la acción es avanzar, y ambos vehículos lo puede realizar, lo harán de maneras diferentes, más rápido, con más potencia y también consumarán más o menos nafta dependiendo el vehículo elegido. Focalicemos nuestro problema en el consumo de nafta.
Este tipo de problemas podríamos resolverlo con algunos if o también con switch para descontar la cantidad de nafta adecuada o ejecutar métodos de diferentes objetos para realizar dicha tarea.
Pero para este tipo de necesidades y más tenemos polimorfismo
Entonces el polimorfismo nos permite a un mismo nombre de método representar código diferente.

Veamos el ejemplo de los vehículos representados en el código

<?php
class Vehiculo{
 
    protected $nafta = 100; //Comienza con 100 litros de nafta
 
    public function getNafta(){
	return $this->nafta;
    }
}
 
class Ferrari extends Vehiculo{
 
    public function avanzar(){
        $this->nafta -= 20;
    }
}
 
 
class Fiat extends Vehiculo{
 
    public function avanzar(){
        $this->nafta -= 8;
    }
}
 
class Usuario {
 
    private $vehiculo;
 
    function __construct($objeto){
	$this->vehiculo = $objeto;
    }
 
    public function avanzarVehiculo(){
	$this->vehiculo->avanzar();
    }
 
    public function nafta(){
	return $this->vehiculo->getNafta();
    }
}
 
$usuario1 = new Usuario (new Fiat);
$usuario1->avanzarVehiculo();
 
$usuario2 = new Usuario (new Ferrari);
$usuario2->avanzarVehiculo();
 
echo "Al Fiat del usuario 1 le quedan " . $usuario1->nafta() . " litros de nafta<br/>";
// Al Fiat del usuario 1 le quedan 92 litros de nafta
echo "Al Ferrari del usuario 2 le quedan " . $usuario2->nafta() . " litros de nafta<br/>";
// Al Ferrari del usuario 2 le quedan 80 litros de nafta
?>

Como podemos observar el constructor de la clase Usuario recibe como parámetro un objeto, éste será el vehículo con el que trabajará el usuario.
La clase Usuario posee el método avanzarVehiculo el cual trabajará directamente con el objeto que hemos pasado en el constructor y asignado posteriormente a la propiedad vehiculo.
De está manera podríamos tener infinidad de vehículos para elegir y cada uno de ellos tendrá su clase con sus especificaciones y Usuario jamás sabría con que vehículo estamos trabajando.

Written by Daniel Segovia

abril 14th, 2011 at 12:18 pm