Saltar al contenido principal

Herencia y Polimorfismo

Dos de los pilares más importantes de la Programación Orientada a Objetos (POO) son la Herencia y el Polimorfismo. Estos conceptos te permiten reducir masivamente la repetición de código y crear sistemas flexibles.

Herencia

La Herencia permite crear una nueva clase (Clase Hija / Subclase) que absorbe todos los atributos y métodos de una clase existente (Clase Padre / Superclase), y además puede añadir los suyos propios o modificar los heredados.

Imagina que tienes diferentes tipos de empleados. Todos tienen nombre y salario, pero tareas diferentes.

# CLASE PADRE
class Empleado:
def __init__(self, nombre, salario):
self.nombre = nombre
self.salario = salario

def trabajar(self):
print(f"{self.nombre} está realizando labores genéricas por un salario de {self.salario}.")

# CLASE HIJA (Hereda de Empleado)
class Desarrollador(Empleado):
def __init__(self, nombre, salario, lenguaje_favorito):
# super() llama al constructor de la clase Padre
super().__init__(nombre, salario)
self.lenguaje_favorito = lenguaje_favorito

# "Sobrescribiendo" un método
def trabajar(self):
print(f"{self.nombre} está escribiendo código en {self.lenguaje_favorito}.")

class Gerente(Empleado):
def trabajar(self):
print(f"{self.nombre} está gestionando el equipo.")

Al utilizarlo:

juan = Desarrollador("Juan", 4000, "Python")
ana = Gerente("Ana", 6000)

juan.trabajar() # Salida: Juan está escribiendo código en Python.
ana.trabajar() # Salida: Ana está gestionando el equipo.

Polimorfismo

Polimorfismo significa "muchas formas". En programación, permite que objetos de diferentes clases (generalmente relacionadas por herencia) respondan de manera distinta a exactamente el mismo nombre de método.

En el ejemplo anterior, tanto juan como ana pueden ejecutar el método .trabajar(), pero el comportamiento será diferente dependiendo del "tipo" de objeto que sean (Desarrollador vs Gerente).

¿Por qué es útil el Polimorfismo?

Imagina que tienes una lista mezclada de muchos empleados de distintos tipos y necesitas que todos empiecen a trabajar a las 9 AM. No necesitas comprobar qué es cada uno, solo llamas a su método.

# Lista de objetos de diferentes tipos, pero con un método en común
equipo = [
Desarrollador("Carlos", 3000, "JavaScript"),
Gerente("María", 5000),
Empleado("Pedro", 2000)
]

for miembro in equipo:
# Polimorfismo en acción: cada objeto sabe CÓMO trabajar a su manera.
miembro.trabajar()

Estos dos conceptos combinados hacen que estructurar aplicaciones grandes y mantenerlas a lo largo del tiempo sea infinitamente más fácil.