Link Search Menu Expand Document

Polimorfismo en programaci贸n

El polimorfismo es uno de los pilares b谩sicos en la programaci贸n orientada a objetos, por lo que para entenderlo es importante tener las bases de la POO y la herencia bien asentadas.

El t茅rmino polimorfismo tiene origen en las palabras poly (muchos) y morfo (formas), y aplicado a la programaci贸n hace referencia a que los objetos pueden tomar diferentes formas. 驴Pero qu茅 significa esto?

Pues bien, significa que objetos de diferentes clases pueden ser accedidos utilizando el mismo interfaz, mostrando un comportamiento distinto (tomando diferentes formas) seg煤n c贸mo sean accedidos.

En lenguajes de programaci贸n como Python, que tiene tipado din谩mico, el polimorfismo va muy relacionado con el duck typing.

Sin embargo, para entender bien este concepto, es conveniente explicarlo desde el punto de vista de un lenguaje de programaci贸n con tipado est谩tico como Java. Vamos a por ello.

Polimorfismo en Java

Vamos a comenzar definiendo una clase Animal.

// C贸digo Java
class Animal{ 
    public Animal() {} 
}

Y dos clases Perro y Gato que heredan de la anterior.

// C贸digo Java
class Perro extends Animal {
    public Perro() {}
}

class Gato extends Animal {
    public Gato() {}
}

El polimorfismo es precisamente lo que nos permite hacer lo siguiente:

// C贸digo Java
Animal a = new Perro();

Recuerda que Java es un lenguaje con tipado est谩tico, lo que significa que el tipo tiene que ser definido al crear la variable.

Sin embargo estamos asignando a una variable Animal un objeto de la clase Perro. 驴C贸mo es esto posible?

Pues ah铆 lo tienes, el polimorfismo es lo que nos permite usar ambas clases de forma indistinta, ya que soportan el mismo 鈥渋nterfaz鈥 (no confundir con el interface de Java).

El siguiente c贸digo es tambi茅n correcto. Tenemos un array de Animal donde cada elemento toma la forma de Perro o de Gato.

// C贸digo Java
Animal[] animales = new Animal[10];
animales[0] = new Perro();
animales[1] = new Gato();

Sin embargo, no es posible realizar lo siguiente, ya que OtraClase no comparte interfaz con Animal. Tendremos un error error: incompatible types.

// C贸digo Java
class OtraClase { 
    public OtraClase() {} 
}
Animal a = new OtraClase();
animales[0] = new OtraClase();

Polimorfismo en Python

El t茅rmino polimorfismo visto desde el punto de vista de Python es complicado de explicar sin hablar del duck typing, por lo que te recomendamos la lectura.

Al ser un lenguaje con tipado din谩mico y permitir duck typing, en Python no es necesario que los objetos compartan un interfaz, simplemente basta con que tengan los m茅todos que se quieren llamar.

Podemos recrear el ejemplo de Java de la siguiente manera. Supongamos que tenemos un clase Animal con un m茅todo hablar().

class Animal:
    def hablar(self):
        pass

Por otro lado tenemos otras dos clases, Perro, Gato que heredan de la anterior. Adem谩s, implementan el m茅todo hablar() de una forma distinta.

class Perro(Animal):
    def hablar(self):
        print("Guau!")

class Gato(Animal):
    def hablar(self):
        print("Miau!")

A continuaci贸n creamos un objeto de cada clase y llamamos al m茅todo hablar(). Podemos observar que cada animal se comporta de manera distinta al usar hablar().

for animal in Perro(), Gato():
    animal.hablar()

# Guau!
# Miau!

En el caso anterior, la variable animal ha ido 鈥渢omando las formas鈥 de Perro y Gato. Sin embargo, n贸tese que al tener tipado din谩mico este ejemplo hubiera funcionado igual sin que existiera herencia entre Perro y Gato, pero esta explicaci贸n la dejamos para el cap铆tulo de duck typing

Existen otros conceptos muy importantes y relacionados con la programaci贸n orientada a objetos. Aqu铆 te los dejamos: